Hi Markus,
Here is the JUnit test that causes the error condition:
@Test
public void checkout()
{
boolean testRemove = true;
System.out.println("starting checkout");
String userName = "rodrigo";
EntityManager em = getEntityManager();
// New AppUser
AppUser user = new AppUser();
user.setUsername(userName);
user.setFirstName("Mickey");
user.setLastName("Mouse");
user.setPassword("nopass");
// AppUser becomes a customer
CustomerNature customerNature = new CustomerNature();
user.setCustomerNature(customerNature);
// Give the user a shopping cart
ShoppingCart shoppingCart = new ShoppingCart();
customerNature.setShoppingCart(shoppingCart);
// Add some items to the cart
// New offering
Offering offering = new Offering();
offering.setName("Rubber Ducky");
offering.setDescription("A nice rubber duck.");
offering.setPrice(new Double(10.00));
// Create a new ShoppingCartItem to put in the cart
ShoppingCartItem shoppingCartItem = new ShoppingCartItem();
shoppingCartItem.setOffering(offering);
Offering offering2 = new Offering();
offering2.setName("Dog");
offering2.setDescription("A lovely dog.");
offering2.setPrice(new Double(50.00));
// Create a new ShoppingCartItem to put in the cart
ShoppingCartItem shoppingCartItem2 = new ShoppingCartItem();
shoppingCartItem2.setOffering(offering2);
// Add the items to the cart
shoppingCart.addItem(shoppingCartItem);
shoppingCart.addItem(shoppingCartItem2);
assertEquals(shoppingCart.getTotal(), 60.00);
// Create a billing details
CreditCardBillingDetails billingDetails = new
CreditCardBillingDetails();
billingDetails.setName("Company credit card");
billingDetails.setDescription("Used for business purchases.");
billingDetails.setAccountNumber("4111111111111111");
billingDetails.setCreditCardType("VISA");
billingDetails.setExpiryDate(new Date());
billingDetails.setNameOnCard(customerNature.getAppUser().getFullName());
// Create a customer order
CustomerOrder customerOrder = new CustomerOrder();
customerOrder.setCustomerNature(customerNature);
customerOrder.setShoppingCart(shoppingCart);
customerOrder.setBillingDetails(billingDetails);
// CustomerOrder.setBillingDetails should add this billingDetails
to customerNature
assertTrue(customerNature.getBillingDetails().get(0).equals(billingDetails));
System.out.println("Persisting...");
try
{
em.getTransaction().begin();
em.persist(offering);
em.persist(offering2);
em.persist(user);
em.getTransaction().commit();
}
catch(Exception e)
{
//fail("Persist failed: " + e.getMessage());
try
{
em.getTransaction().rollback();
}
catch(Exception ex)
{
//fail("Rollback of Persist failed: " + ex.getMessage());
}
e.printStackTrace();
}
System.out.println("Persisted.");
if(testRemove)
{
System.out.println("Removing...");
try
{
em.getTransaction().begin();
em.remove(user);
em.remove(offering);
em.remove(offering2);
em.getTransaction().commit();
}
catch(Exception e)
{
//fail("Remove failed: " + e.getMessage());
try
{
em.getTransaction().rollback();
}
catch(Exception ex)
{
//fail("Rollback of Remove failed: " + ex.getMessage());
}
e.printStackTrace();
}
System.out.println("Removed.");
}
}
Thanks!
Greg
Markus Fuchs wrote:
Hi Greg,
hard to tell. The mapping is correct. Could you post your test program
here?
Thanks,
-- markus.
Greg Ederer wrote On 11/12/06 09:08,:
Hi,
Following Markus' excellent advice on my OneToOne cascade question, I
subsequently created the following implementation:
CustomerNature has:
@OneToMany(cascade={CascadeType.ALL},
mappedBy="customerNature")
private List<CustomerOrder> customerOrders = new
ArrayList<CustomerOrder>();
CustomerOrder has:
@ManyToOne
@JoinColumn(name="customer_nature", nullable=false)
private CustomerNature customerNature;
When I run my tests, I get:
javax.persistence.RollbackException: Exception [TOPLINK-4002]
(Oracle TopLink Essentials - 2006.8 (Build 060830)):
oracle.toplink.essentials.exceptions.DatabaseException
Internal Exception: org.postgresql.util.PSQLException: ERROR: update or
delete on "customer_nature" violates foreign key constraint
"fk_customer_order_customernature_id" on "customer_order"
Detail: Key (id)=(3) is still referenced from table
"customer_order".Error Code: 0
Call:DELETE FROM customer_nature WHERE (ID = ?)
bind => [3]
I am gradually working my way through the JSR 220 specification (wish I
had more time to devote to this). In the mean time, could some kind
soul please enlighten me on this issue?
Thanks!
Greg