2013-12-11 2 views
2

Это мои классы:Hibernate однонаправленный один-ко-многим: Упорство родитель с детьми

@Entity 
public class Parent implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue 
    private long id; 

    @OneToMany(orphanRemoval = true, cascade = {CascadeType.ALL}, fetch = FetchType.EAGER) 
    @JoinColumn(name="parent_id", nullable = false) 
    private List<Children> childrens = new ArrayList<Children>();  

    // ... 
} 

@Entity 
public class Children implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue 
    private long id; 

    // NO BIDIRECTIONAL MAPPING 
    // ... 
} 

При попытке упорствовать объект Дети (с), родительский объект (р) не сохраняется на базе:

Children c = new Children(); 
Parent p = new Parent(); 

p.getChildrens().add(c); 

childrenDAO.save(c); // Common DAO implementation. It executes a persist on a entity manager 

Как я могу это сделать? Мне нужно сделать это от ChildrenDAO.

+0

Вы уже сделали это: 'childrenDAO.save (c)' выполнит эту работу. –

+0

@AndreiI да, в DAO я делаю 'this.getEntityManager(). Persist (element); // element = Дети c', но сохраняются только свойства дочерних элементов, не создается родительская запись. – EJP4

+0

Почему бы вам не позвонить тогда также 'this.getEntityManager(). persist (parent)'? –

ответ

0

Без обратной связи с детьми для родителей невозможно, чтобы это произошло автоматически. Это связано с тем, что провайдер JPA не имеет всего объектного графа в своем кеше, то есть очень вероятно, что родитель просто не известен поставщику JPA.

Так решить проблему, которую вы можете сделать один из вещей:

  1. Добавить обратную связь от детей Родителя и применять PERSIST каскадирование.
  2. Перенесите родителя вручную (используя parentDao или напрямую с помощью EntityManager.persist()).
Смежные вопросы