Невозможно сохранить новый граф объектов, используя JPA (hibernate) с простыми отношениями oneToMany - ManyToOne - PullRequest
2 голосов
/ 11 марта 2011

Я пытаюсь сохранить / объединить новый граф объектов через jpa, но похоже, что порядок сохранения неправильный, так как он пытается сохранить дочерние объекты, которые имеют ограничение на присутствие своего родителя.

public class ObjectA implements Serializable {
  ...
  @OneToMany(cascade = CascadeType.ALL, mappedBy = "objectAId")
  private List<ObjectB> objectBList;
  ...
}

и

public class ObjectB implements Serializable {
  ...
  @JoinColumn(name = "OBJECT_A_ID", referencedColumnName = "ID", nullable = false)
  @ManyToOne(optional = false)
  private ObjectA objectAId;
  ...
}

Я создам новую сущность ObjectA и несколько новых сущностей ObjectB и добавлю их в Object A. При слиянии ObjectA я получаю следующее:

org.hibernate.PropertyValueException: not-null property references a null or transient value: com.mycompany.data.ObjectB.objectAId

Что я пропускаю или делаю неправильно?

1 Ответ

9 голосов
/ 11 марта 2011

Вы несете ответственность за то, чтобы обе стороны двунаправленных отношений находились в согласованном состоянии для объектов в памяти.Другими словами, когда вы добавляете ObjectB к ObjectA.objectBList, вы также должны заставить ObjectB.objectAId указывать на соответствующий ObjectA.

Более того, без optional = false вы сможете сохранять объекты безошибки, но отношения между ними не будут сохраняться, если ObjectB.objectAId равно null.Это происходит потому, что Hibernate рассматривает состояние стороны владения при сохранении его в базе данных, а в случае двунаправленной стороны владения отношениями «один ко многим» - сторона «многие» (ObjectB)

...