2010-12-01 8 views
3

私は、「章」のツリー構造をマップしたいと思います。すべての章には、その親への参照と、サブチャプターの順序付きリスト(「位置」による)があります。次のように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はこれを実行しようとしなぜならpositionNOT NULL制約の失敗の文

update 
    Chapter 
set 
    parentChapter_id=null, 
    position=null 
where 
    parentChapter_id=? 
    and id=? 

@OrderColumn(name="position")が削除された場合 、Hibernateはpositionを更新しません(したがって、それは動作します)、その後(サブ)Chapterを削除します。 次に何がそれを削除し、将来の孤児と最初更新に休止状態の原因は?それはないリスト要素(章)のために、リスト自体のプロパティです:-)

答えて

2

問題は、特別position財産について、概念的なものです。だから、私は違っそれを行うだろう:あなたはここで2つの構造体を持っている

@Entity 
public class Chapter { 
    @Id @GeneratedValue 
    private long id; 

    @ManyToOne 
    private Chapter parent; 

    @OneToMany(mappedBy="parent") 
    @OrderColumn(name="position") 
    private List<Chapter> children; 
} 

注:章とリストを。ポイントは、リストの状態も永続的でなければならないということですが、構造体の章には関係しません。したがって、それ自身のためのテーブルが必要です(それは、 "generate ddl"を有効にすると、Hibernateがやろうとしていることです)。

あなたは彼らのテストスイートからこの例を見ることができます:あなたは、彼らが注釈を使用していないことがわかります https://github.com/hibernate/hibernate-core/tree/master/hibernate-core/src/test/java/org/hibernate/test/collection/list/

、しかし、あなたは簡単に

+0

ありがとうpartenon :-)それを翻訳することができますが、どのようにすることができますチャプターの位置にアクセスしますか? – Zeemee

+0

位置は、リスト構造体の実装の詳細です。あなたは*リストの範囲外で、このプロパティを操作する*必要がある場合は、その後、私はあなたが別の構造体を必要とし、いくつかの非標準的な方法を使用して、それをマップすることを言うと思います。 – jpkrohling

関連する問題