私は、「章」のツリー構造をマップしたいと思います。すべての章には、その親への参照と、サブチャプターの順序付きリスト(「位置」による)があります。次のようにJPA 2.0、3.5をHibernateで は、実体「章」になります。は、なぜそれを削除する前にマッピングされたリストで削除要素にnullにフィールドを@OrderColumn/JPAセットを休止状態にしますか?
@Entity
public class Chapter {
@Id
@GeneratedValue
private long id;
@Column(name="position", nullable=false)
private int position;
@ManyToOne
@JoinColumn(name="parentChapter_id", updatable=false, insertable=false)
private Chapter parentChapter;
@OneToMany(cascade=CascadeType.ALL, orphanRemoval=true)
@OrderColumn(name="position")
@JoinColumn(name="parentChapter_id")
private List<Chapter> subChapters = new ArrayList<Chapter>();
public List<Chapter> getSubChapters() {
return subChapters;
}
}
subChapters
の要素の一つが削除された場合の問題は、ある
// EntityManager em
Chapter parent = em.find(Chapter.class, 1);
subChapters = parent.getSubChapters();
subChapters.remove(1);
EntityTransaction tx = em.getTransaction();
tx.begin();
em.persist(parent);
tx.commit();
その後、Hibernateはこれを実行しようとしなぜならposition
のNOT NULL
制約の失敗の文
update
Chapter
set
parentChapter_id=null,
position=null
where
parentChapter_id=?
and id=?
。 @OrderColumn(name="position")
が削除された場合 、Hibernateはposition
を更新しません(したがって、それは動作します)、その後(サブ)Chapter
を削除します。 次に何がそれを削除し、将来の孤児と最初更新に休止状態の原因は?それはないリスト要素(章)のために、リスト自体のプロパティです:-)
ありがとうpartenon :-)それを翻訳することができますが、どのようにすることができますチャプターの位置にアクセスしますか? – Zeemee
位置は、リスト構造体の実装の詳細です。あなたは*リストの範囲外で、このプロパティを操作する*必要がある場合は、その後、私はあなたが別の構造体を必要とし、いくつかの非標準的な方法を使用して、それをマップすることを言うと思います。 – jpkrohling