2013-06-11 11 views
8

私は、次のしている休止状態entitesを外部キーを設定し、私はDAOでエンティティ«のModelView»を削除するとHibernateはnullにする場合、削除するエンティティ

@Entity 
public class Page { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "page_id") 
    private Integer id; 

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
    @JoinColumn(name = "page_id") 
    @IndexColumn(name = "modelView_id") 
    private Set<ModelView> modelViews = new HashSet<ModelView>(); 

    /* getters and setters */ 
} 

私が持っている例外:

ORA-01407: unable to replace ("MODEL_VIEW"."PAGE_ID") to NULL 

どうしたのですか?削除する前に外部キーをNULLに設定するのはなぜですか?

答えて

21

hibernateが削除前にNULLに外部キーを設定するのはなぜですか?

Hibernateは、FKをヌルアウトすることによって削除しようとしているレコードを逆参照しようとします。残念ながら、ほとんどの場合、FKはNULL不可能です。 Pageレコードを削除するときに、ModelViewインスタンスを更新しないようにHibernateに指示する必要があります。

ModelViewpage@JoinColumnマッピングにfalseにinsertableupdatableを変更してみてください:これらの値を使用している場合

@JoinColumn(name = "page_id", nullable = false, insertable = false, updatable = false) 

ModelViewレコードが残ります。これは、参照整合性を強制する場合にはうまくいきません。これを回避するには、削除のカスケードをオンにする必要があります。私はあなたのコードで既にあなたはすでにうまくいくはずCascadeType.ALLを使用していることがわかります。

In JPA why and how to use insertable and updatable parameter?

私は、これらの値のためfalseを用いて固定された同様の問題があった。ここで

は、これらのフィールドを説明してSO Q &です。

How can I map "insert='false' update='false'" on a composite-id key-property which is also used in a one-to-many FK?

+0

この場合には、私は、インサートエンティティ«のModelView»(ORA-01400:( "MODEL_VIEW" "PAGE_ID" にNULLを挿入することができない))に同じエラーを持っているので、これは、私のためのソリューションではありません。私はset FK nullableを試してみましたが、良い考えではありません。他の解決策はありますか? – AnEi

+0

この提案された解決策は、その問題をINSERT文でも解決する必要があります。 'insertable'と' updatable'を 'false'に設定すると、Hibernateは' ModelView'レコードへの変更の保存を手動で処理するように指示します。これは、最初に 'Page'レコードをINSERT/UPDATEしてから' ModelView'でFKを設定し、それらを独立して保存することを意味します。これを行うと、FKがNULLの場合がありません。 –

+0

@AnEiこれらのエラーがまだ発生している場合は、使用しているコードの一部を共有することはできますか? –

関連する問題