2

私はHibernate 3.6を使用しており、次のようなものがあります:

@Entity 
public class Parent { 
    @OnyToMany( fetch = FetchType.LAZY, cascade = { ascadeType.ALL } )   
    @Cascade( { org.hibernate.annotations.CascadeType.SAVE_UPDATE, org.hibernate.annotations.CascadeType.DELETE )   
    @JoinColumn( name="Parent_ID" )
    public List<Child> getChildren() { return children; }   
public void setChildren( List<Child> children ) { this.children = children; }
private transient List<TitleMetadataCategory> children;
...
 }

@Entity
public class Child {
....
}

関連付けはいくつかの理由で単方向であり、変更したくありません。さらに、孤立した子は存在しないため、CHILD.PARENT_ID が null でないという DB 制約があります。子を削除することを除いて、すべて正常に動作します。私がする時

parent.getChildren().remove(child); session.saveOrUpdate(parent).

それは失敗します。

持ってないから

@ManyToOne( optional=false )

子側で、Hibernate は子を PARENT_ID=NULL で更新しようとし、DB 制約のために失敗します。

それを修正する方法はありますか?

4

3 に答える 3

4

やってみました

@JoinColumn(name = "Parent_ID", nullable = false)

また、アタッチされたエンティティは自動的に永続化されることに注意してください。を呼び出す必要はありませんsaveOrUpdate()

于 2013-01-17T13:40:48.240 に答える
2

JB Nizet の答えは機能していますが、1 つの修正があります。私は Child.getParentId() メソッド ( getParent() ではない) も持っているので、その Column アノテーションには Parent.getChildren() 関連付けnullable=false, insertable=false, updateble=falseに加えてパラメーターが必要です。nullable=false, updatable=false

于 2013-01-18T13:43:19.997 に答える
0

現在の構成では、Hibernate は、コレクションChildから削除するときに を削除する必要があることを認識していませんchildren(孤立した削除と呼ばれます)。@OneToMany(orphanRemoval=true)親に必要です。org.hibernate.annotations.CascadeType.DELETE親全体が削除されたときに子も削除する必要があることのみを指定します。

于 2013-01-17T13:51:32.643 に答える