2010-12-16 16 views
0

休止状態になっています。私は成功することを試みています。私はカテゴリ、属性、AttributeOptionがあるスキーマを持っています。例えばカテゴリは「コンピュータ」であり、それぞれの属性は「RAM」、「ハードディスク」および'RAM'は属性オプション '512MB'、 '1024MB'を持つことができます 上記のスキーマを休止状態で試してみると、すべてがOKです。データベースに保存されていない休止状態の問題

もう1つの要件があります。 「カテゴリ」には、多くのサブカテゴリがあります。例えば「コンピュータ」はサブカテゴリーとして「ラップトップ」または「ノートブック」を持つことができます。今、これらのサブカテゴリ自体

then I get this scheme: 

     1. Category ------>Category 
      A category can contain many sub categories 
      e.g. A computer can be a notebook or laptop 

     2. Category ------>Attribure 
      A category can have many attribute 
      A notebook can have RAM , Hard Disk, Screen Size 

     3. Attribute ------>AttributeOption 
      An Attribute can have many attribute options 
      e.g. RAM can be 512 MB, 1024 MB 

これらは彼らのgetterとsetter

Class Category: 
public class Category implements IsSerializable 
{ 
    private long CategoryId; 
    private String CategoryName; 
    private Set <Category> SubCategory=new HashSet <Category>(); 
    private Set <Attribute> AllAttributes= new HashSet <Attribute>(); 

} 
Category Mapping File: 


<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<!-- Generated Dec 16, 2010 8:07:32 AM by Hibernate Tools 3.4.0.Beta1 --> 
<hibernate-mapping> 
    <class name="com.BiddingSystem.Models.Category" table="CATEGORY"> 
     <id name="CategoryId" type="long"> 
      <column name="CATEGORYID" /> 
      <generator class="native" /> 
     </id> 
     <property name="CategoryName" type="java.lang.String"> 
      <column name="CATEGORYNAME" /> 
     </property> 
     <many-to-one name="ParentCategory" class="com.BiddingSystem.Models.Category"> 
      <column name="PARENTCATEGORYID" /> 
     </many-to-one> 
     <set name="SubCategory" inverse="true" lazy="true" cascade="all" fetch="join"> 
      <key> 
       <column name="PARENTCATEGORYID" /> 
      </key> 
      <one-to-many class="com.BiddingSystem.Models.Category" /> 
     </set> 
     <set name="AllAttributes" table="ATTRIBUTE" inverse="false" lazy="true"> 
      <key> 
       <column name="CATEGORYID" /> 
      </key> 
      <one-to-many class="com.BiddingSystem.Models.Attribute" /> 
     </set> 
    </class> 
</hibernate-mapping> 


Class Attribute: 
public class Attribute 
{ 
    private long AttributeId; 
    private String AttributeName; 
    private Set <AttributeOption> Options= new HashSet <AttributeOption>(); 
} 

Attribute Mapping File: 
<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<!-- Generated Dec 16, 2010 5:25:09 AM by Hibernate Tools 3.4.0.Beta1 --> 
<hibernate-mapping> 
    <class name="com.BiddingSystem.Models.Attribute" table="ATTRIBUTE"> 
     <id name="AttributeId" type="long"> 
      <column name="ATTRIBUTEID" /> 
      <generator class="native" /> 
     </id> 
     <property name="AttributeName" type="java.lang.String"> 
      <column name="ATTRIBUTENAME" /> 
     </property> 
     <set name="Options" table="ATTRIBUTEOPTION" inverse="false" cascade="all"> 
      <key> 
       <column name="ATTRIBUTEID" /> 
      </key> 
      <one-to-many class="com.BiddingSystem.Models.AttributeOption" /> 
     </set> 
    </class> 
</hibernate-mapping> 


Class AttributeOption: 
public class AttributeOption 
{ 
    private long AttributeOptionId; 
    private String Option; 
    private String SQLValue; 
} 
Attribute Mapping File: 
<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<!-- Generated Dec 16, 2010 5:25:09 AM by Hibernate Tools 3.4.0.Beta1 --> 
<hibernate-mapping> 
    <class name="com.BiddingSystem.Models.AttributeOption" table="ATTRIBUTEOPTION"> 
     <id name="AttributeOptionId" type="long"> 
      <column name="ATTRIBUTEOPTIONID" /> 
      <generator class="native" /> 
     </id> 
     <property name="Option" type="java.lang.String"> 
      <column name="OPTION" /> 
     </property> 
     <property name="SQLValue" type="java.lang.String"> 
      <column name="SQLVALUE" /> 
     </property> 
    </class> 
</hibernate-mapping> 

私は次のことをしようとしていなくて私のクラスをしているクラスのカテゴリーです。私は何のエラーも出ていませんが、それは 'コンピュータ'のカテゴリーである 'ラップトップ'を保存していない、それ以外はすべて保存されています。だから私は、問題はカテゴリマッピングファイルから、この部分にあると思う:

<set name="SubCategory" table="CATEGORY" cascade="all"> 
      <key> 
       <column name="CATEGORYID" /> 
      </key> 
      <one-to-many class="com.BiddingSystem.Models.Category" /> 
     </set> 



This is part of my program 


    Category C=new Category(); 
    C.setCategoryName("Computer"); 
    AttributeOption R512= new AttributeOption();R512.setOption("512");R512.setSQLValue("512"); 
    AttributeOption R1024= new AttributeOption();R1024.setOption("1024");R1024.setSQLValue("1024"); 


     Category C0= new Category(); 
    C0.setCategoryName("Laptop"); 

    C.getSubCategory().add(C0); 

    Attribute RAM= new Attribute(); 
    RAM.setAttributeName("RAM"); 

    RAM.getOptions().add(R512);RAM.getOptions().add(R1024); 

    C.getAllAttributes().add(RAM); 



    Transaction tx = null; 
    try 
    { 
     tx=session.beginTransaction(); 
     tx.begin(); 
     session.saveOrUpdate(C); 
     tx.commit(); 
     return true; 
    } 
    catch (Exception e) 
    { 
     tx.rollback(); 
     e.printStackTrace(); 
     return false; 
    } 

答えて

0

[OK]を、私はそれを作りました作業する

重要なのはカテゴリマッピングですファイル:

<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<!-- Generated Dec 16, 2010 8:37:02 AM by Hibernate Tools 3.4.0.Beta1 --> 
<hibernate-mapping> 
    <class name="com.BiddingSystem.Models.Category" table="CATEGORY"> 
     <id name="CategoryId" type="long"> 
      <column name="CATEGORYID" /> 
      <generator class="native" /> 
     </id> 
     <property name="CategoryName" type="java.lang.String"> 
      <column name="CATEGORYNAME" /> 
     </property> 

     <many-to-one name="ParentCategory" class="com.BiddingSystem.Models.Category"> 
      <column name="PARENT_CATEGORY_ID" /> 
     </many-to-one> 

     <set name="SubCategory" lazy="false" cascade="all-delete-orphan" inverse="true"> 
      <key> 
       <column name="PARENT_CATEGORY_ID" /> 
      </key> 
      <one-to-many class="com.BiddingSystem.Models.Category" /> 
     </set> 

     <set name="AllAttributes" table="ATTRIBUTE" inverse="false" lazy="true"> 
      <key> 
       <column name="CATEGORYID" /> 
      </key> 
      <one-to-many class="com.BiddingSystem.Models.Attribute" /> 
     </set> 
    </class> 
</hibernate-mapping> 
0

Hummm、私はこのコードの改善のためのいくつかの場所を参照してください。 まず、あなたはあなたのエンティティを永続化するために存続()メソッドを使用する必要があります。 第2に、オブジェクトグラフ全体を永続化するには、次のいずれかを実行する必要があります。a)サブオブジェクトを手動で永続化し、次に「メイン」オブジェクトを永続化するか、またはb)関係のCascadeパラメータを使用して、「メイン」オブジェクトを永続化すると、関連するサブオブジェクトの永続性がトリガーされます。

あなたがここにカスケード接続により多くの情報を見つけることができます

http://docs.jboss.org/hibernate/stable/core/reference/en/html/example-parentchild.html#example-parentchild-cascades

+0

雅、私はすべての場所のデータベース – Noor

1

何かがこれで間違っているようだ:

C0.getSubCategory().add(C0); 

が、それはすべきではない:

C.getSubCategory().add(C0); 
+0

つの余分なコメントに手動セーブを防止するためのカスケードを配置している:リレーショナルモデルにおけるながら、オブジェクト指向プログラミングでは、2つのオブジェクト間のリンクは、一方向のリンクであることに注意してくださいそれは双方向リンクです(両側から関係をナビゲートすることができます)。したがって、この場合、親にはサブカテゴリのセットが含まれているように見えますが、そのカテゴリはその親について何も知りません。通常、関係の両側を設定することをお勧めします。 Hibernateテストスイートの次の例を参照してください:https://github.com/hibernate/hibernate-core/blob/master/hibernate-core/src/test/java/org/hibernate/test/collection/set/PersistentSetTest.java – jpkrohling

+0

実際には、同じクラスのオブジェクトへの参照を使用するので、これはさらに良い例です:https://github.com/hibernate/hibernate-core/blob/master/hibernate-core/src/test/java/ org/hibernate/test/collection/list/PersistentListTest.java – jpkrohling

+0

エラーのため、オーバーフローで貼り付けるときに作成しました。 – Noor

関連する問題