В моем приложении операция гибернации выглядит следующим образом.Приложение обновляет родительскую сущность новыми значениями из запроса и удаляет все существующие (ранее вставленные) дочерние сущности и вставляет новые дочерние записи.
Для этого я использую спящие DELETE_ORPHAN
, как вы можете видетьниже.
Когда я делаю это, я получаю следующее исключение:
org.hibernate.HibernateException: коллекция с cascade = "all-delete-orphan" не былана которую ссылается экземпляр объекта-владельца: com.childs
Я видел похожие потоки с проблемой и пытался применить решения в этих потоках.Но это не сработало
Моя родительская сущность
public class Parent implements Serializable {
@Column(name = "PARENT_ID")
@Basic(fetch = FetchType.EAGER)
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq")
@SequenceGenerator(name = "seq", sequenceName = "seq")
private Integer parentId; //primary key of parent
.......
........
//mapping to child entity
@OneToMany(mappedBy = "parent", cascade = { CascadeType.ALL }, fetch = FetchType.LAZY)
@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
private Set<Child> childs;
................
...............
}
Дочерняя сущность имеет комбинированный ключ и имеет PK-сущность, как показано ниже
public class ChildPK implements Serializable {
/** The Constant serialVersionUID. */
private static final long serialVersionUID = -447592368963477750L;
/** . */
@ManyToOne(cascade = { CascadeType.ALL }, fetch = FetchType.LAZY)
@JoinColumns( { @JoinColumn(name = "PARENT_ID", referencedColumnName = "PARENT_ID") })
@Id
private Parent parent;
/**. */
@Column(name = "CHILD_ID")
@Basic(fetch = FetchType.EAGER)
@Id
@GenericGenerator(name="child_seq", strategy="com.DB2Dialect")
@GeneratedValue(generator="child_seq")
private Integer childId;
}
child entity goes like this:
public class Child implements Serializable {
/** The Constant serialVersionUID. */
private static final long serialVersionUID = 185670997643552301L;
/** The pol cntct id. */
@Column(name = "CHILD_ID")
@Basic(fetch = FetchType.EAGER)
@Id
private Integer childId;
@ManyToOne(cascade = { CascadeType.ALL }, fetch = FetchType.LAZY)
@JoinColumns( { @JoinColumn(name = "PARENT_ID", referencedColumnName = "PARENT_ID") })
@Id
private Parent parent;
}
Java-код
...................
..............
parent.getChild().clear();
Child child = new Child();
parent.setChild(child);
Что тут может быть не так.
Заранее спасибо ...