Hibernate triggering constraint violations using orphanRemoval

Posted by ptomli on Stack Overflow See other posts from Stack Overflow or by ptomli
Published on 2010-06-18T10:26:23Z Indexed on 2010/06/18 11:33 UTC
Read the original article Hit count: 364

Filed under:
|
|
|

I'm having trouble with a JPA/Hibernate (3.5.3) setup, where I have an entity, an "Account" class, which has a list of child entities, "Contact" instances. I'm trying to be able to add/remove instances of Contact into a List<Contact> property of Account.

Adding a new instance into the set and calling saveOrUpdate(account) persists everything lovely. If I then choose to remove the contact from the list and again call saveOrUpdate, the SQL Hibernate seems to produce involves setting the account_id column to null, which violates a database constraint.

What am I doing wrong?

The code below is clearly a simplified abstract but I think it covers the problem as I'm seeing the same results in different code, which really is about this simple.

SQL:

CREATE TABLE account ( INT account_id );
CREATE TABLE contact ( INT contact_id, INT account_id REFERENCES account (account_id) );

Java:

@Entity
class Account {
  @Id
  @Column
  public Long id;

  @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
  @JoinColumn(name = "account_id")
  public List<Contact> contacts;
}

@Entity
class Contact {
  @Id
  @Column
  public Long id;

  @ManyToOne(optional = false)
  @JoinColumn(name = "account_id", nullable = false)
  public Account account;
}

Account account = new Account();
Contact contact = new Contact();

account.contacts.add(contact);
saveOrUpdate(account);

// some time later, like another servlet request....

account.contacts.remove(contact);
saveOrUpdate(account);

Result:

UPDATE contact SET account_id = null WHERE contact_id = ?

Edit #1:

It might be that this is actually a bug http://opensource.atlassian.com/projects/hibernate/browse/HHH-5091

© Stack Overflow or respective owner

Related posts about java

Related posts about hibernate