Hibernate OneToMany сгенерировал внешний ключ - PullRequest
1 голос
/ 04 августа 2011

У меня следующая структура таблицы:

parent(parentId)
child(childId, parentId fk)

Затем у меня есть следующие объекты:

@Entity
@Table(name = "parent")
public class Parent {
   @Id
   @GeneratedValue(...)
   private String id;

   @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
   @JoinColumn(name = "parentId")
   Set<Child> children
}

@Entity
@Table(name = "child")
public class Child {
   @Id
   @GeneratedValue(...)
   private String id;

   @Column(...)
   private String parentId;

}

Теперь я создаю переходный родительский и дочерний элементы и добавляюпотомок к родителю, затем сохраните родителя:

Parent parent = new Parent();
parent.children.add(new Child());

parentDao.save(parent);

Получаю исключение:

org.hibernate.PropertyValueException: not-null property references a null or transient value

Мой вопрос: Как я могу получить parentId вДля дочернего класса будет автоматически установлено значение, сгенерированное вставкой родительского элемента?

Ответы [ 2 ]

3 голосов
/ 04 августа 2011

Я бы изменил структуру вашего класса следующим образом:

@Entity
@Table(name = "parent")
public class Parent {
   @Id
   @GeneratedValue(...)
   private String id;

   @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
   @JoinColumn(name = "parentId")
   Set<Child> children
}

@Entity
@Table(name = "child")
public class Child {
   @Id
   @GeneratedValue(...)
   private String id;

   @Column(...)
   private Parent parent;

}

Затем, когда hibernate выбирает родительский класс и инициализирует набор дочерних, дочерний класс будет иметь ссылку на родительский класс. Затем, чтобы получить parentId, вы должны позвонить:

Child c = new Child()....
c.parent.id;
1 голос
/ 04 августа 2011

Ваш ребенок должен иметь не private String parentId, а private Parent parent, а когда вы parent.children.add(child), вы также должны child.setParent(parent).См. пример прототипного отношения родитель-потомок в ссылке Hibernate и раздел bidi один-ко-многим ссылки на аннотацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...