Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Save child objects automatically using JPA Hibernate

I have a one-to-many relation between Parent and Child table. In the parent object I have a

List<Child> setChildren(List<Child> childs) 

I also have a foreign key in the Child table. This foreign key is an ID that references a Parent row in database. So in my database configuration this foreign key can not be NULL. Also this foreign key is the primary key in the Parent table.

So my question is how I can automatically save the children objects by doing something like this:

session.save(parent); 

I tried the above but I'm getting a database error complaining that the foreign key field in the Child table can not be NULL. Is there a way to tell JPA to automatically set this foreign key into the Child object so it can automatically save children objects?

Thanks in advance.

like image 242
Marquinio Avatar asked Oct 13 '10 19:10

Marquinio


People also ask

What is MappedBy in JPA?

The purpose of the MappedBy parameter is to instruct JPA: Do NOT create another join table as the relationship is already being mapped by the opposite entity of this relationship.

What is JPA orphanRemoval?

orphanRemoval is an entirely ORM-specific thing. It marks "child" entity to be removed when it's no longer referenced from the "parent" entity, e.g. when you remove the child entity from the corresponding collection of the parent entity.


1 Answers

I tried the above but I'm getting a database error complaining that the foreign key field in the Child table can not be NULL. Is there a way to tell JPA to automatically set this foreign key into the Child object so it can automatically save children objects?

Well, there are two things here.

First, you need to cascade the save operation (but my understanding is that you are doing this or you wouldn't get a FK constraint violation during inserts in the "child" table)

Second, you probably have a bidirectional association and I think that you're not setting "both sides of the link" correctly. You are supposed to do something like this:

Parent parent = new Parent(); ... Child c1 = new Child(); ... c1.setParent(parent);  List<Child> children = new ArrayList<Child>(); children.add(c1); parent.setChildren(children);  session.save(parent); 

A common pattern is to use link management methods:

@Entity public class Parent {     @Id private Long id;      @OneToMany(mappedBy="parent")     private List<Child> children = new ArrayList<Child>();      ...      protected void setChildren(List<Child> children) {         this.children = children;     }      public void addToChildren(Child child) {         child.setParent(this);         this.children.add(child);     } } 

And the code becomes:

Parent parent = new Parent(); ... Child c1 = new Child(); ...  parent.addToChildren(c1);  session.save(parent); 
References
  • Hibernate Core Reference Guide
    • 1.2.6. Working bi-directional links
like image 119
Pascal Thivent Avatar answered Sep 22 '22 20:09

Pascal Thivent