2011-02-11 12 views
0

私はこれをHibernateで必要な方法で解決することはできません。ここでは:私は製品を持って、各製品はそれ自身のフィールドなどを持っています。各製品はTopLevelProductまたはSecondaryProductのいずれかになります。セカンダリ製品はトップレベル製品にリンクされ、トップレベル製品は何もリンクされません。データベースから製品を照会するとき、TopLevelかどうかを知りたいです。リンクされたセカンダリ製品のリストは、後で(またはそれ以前にも取得できますが、それほど必要ではありません)取得できます。Hibernateモデリングの質問

私はこのBeanを使用したものと考える:

public class Product{ 

...properties.. 

Product topLevelProduct; 

...getters and setters... 

} 

問題は、私はtopLevelProductプロパティになど多対1のマッピングた場合、私はトップレベルの製品を削除する問題を抱えているということです。彼らはにリンクされている二次製品を持っている場合、実際には、私が取得:

java.sql.BatchUpdateException: Cannot delete or update a parent row: a foreign key constraint fails (`jacciseweb`.`prodotti`, CONSTRAINT `FKC803BB11ACD3B812` FOREIGN KEY (`prodottoDiRiferimento_ID`) REFERENCES `prodotti` (`ID`)) 

私はTopLevelProductを削除した場合、secondLevelProductsがあまりにも削除されることを期待します。私は別の構造を使うべきですか?たぶん同じものから派生した2つの豆を使用していますか?あるいは、このような関係を逆転させる:

public class Product{ 

...properties.. 

List<Product> secondLevelProducts = new ArrayList<Product>(); 

...getters and setters... 

} 

する。これは、とにかく私に問題を与える:私はちょうどそれが任意の二次製品をしていないことを知っているので、製品が二次的であるかどうかを知るために別のクエリを使用する必要があり、」doesnのそれは二次的であることを意味し、secondLevel製品を持たないトップレベル製品でさえあり得る。

アイデア?

答えて

1

私は休止状態についてはあまりよく分かりませんが、ここでの問題は私にとっては非常に簡単です。第2レベルの製品がそれらを参照すると、トップレベル製品を削除することはできません。

解決策は、トップレベルを削除した場合、第2レベルの製品に何が起こるべきかを定義することです。操作をカスケードすることができます(2番目のレベルの製品はすべて削除されます)。または、第2レベルの製品がトップレベルの製品になります。関連に対して望ましい動作を定義するための休止状態の方法が必要です。ドキュメンテーションで「カスケード削除」のようなものを検索します。

1

あなたはトップレベルの製品が削除されたときにカスケード削除に適用することを決定した場合は別にマルコの回答から、あなたは2つのオプションがあります。トップレベルの製品と二次製品の区別が安定している場合、すなわち

  • を最上位の製品が二次製品になることはありません。その逆の場合は、TopLevelProductSecondaryProductの間の1対多の関係を持つ継承階層としてモデル化できます(この関係は一方向または双方向になります。子供の親製品)。私は今、この権利をしようとしている

    public class Product { 
        @ManyToOne 
        private Product topLevelProduct; // Is null for top level products 
    
        // Applies cascading 
        @OneToMany(mappedBy = "topLevelProduct", cascade = CascadeType.REMOVE) 
        private List<Product> secondaryProducts; 
    
        ... 
    } 
    
+0

  • そうしないと、あなたは、このような何かをProduct sの間の双方向の関係を作成することで、あなたの問題を解決することができます。問題は、セカンダリBeanにtopLevelProductを設定するたびに、私は手動でsecondaryProductsを更新する必要があることです。これを自動的に行う方法はありますか? – gotch4

  • +0

    私は第2の試みを試みました。問題は、 "secondaryProducts"プロパティがPersistentBagで満たされていて、セカンダリBeanがあっても埋められないということです。なぜこれ? – gotch4

    関連する問題