2010-12-16 2 views
0

Я получаю проблему спящего режима. Я стараюсь не добиваться успеха. У меня есть схема, где есть Категория, Атрибут, AttributeOption. например категория может быть «компьютером», а ее соответствующим атрибутом может быть «ОЗУ», «Жесткий диск» и т. д. «ОЗУ» может иметь параметр атрибута «512 МБ», «1024 МБ» Когда я попробую приведенную выше схему с спящим режимом, все в порядке.Проблема с гибернацией Не сохраняется в базе данных

Теперь у меня есть еще одно требование. «Категория» может иметь много подкатегорий. например «Компьютер» может иметь «ноутбук» или «ноутбук» в качестве подкатегорий. Теперь эти подкатегории класса категории сами

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 

Это мои занятия без их получения и установки

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

Хорошо, я сделал это для работы

Ключ к этому относится к категории картографирования Файл:

<?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, я вижу какое-то место для улучшения в этом коде: Во-первых, вы должны использовать метод сохраняются() сохраняться ваши объекты. Во-вторых, чтобы сохранить весь объектный граф, вы должны либо a) перенести под-объекты вручную, а затем на главный объект; или b) использовать параметр Cascade для ваших отношений, так что сохранение «основного» объекта также вызывает постоянство связанных под-объектов.

Вы можете найти более подробную информацию о каскадных здесь: http://docs.jboss.org/hibernate/stable/core/reference/en/html/example-parentchild.html#example-parentchild-cascades

+0

Ya, я поместил каскад каждый, где для предотвращения ручного сохранения в базу данных – Noor 2010-12-16 15:08:00

1

что-то кажется неправильным с этим:

C0.getSubCategory().add(C0); 

Не должно быть:

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

Один дополнительный комментарий: обратите внимание, что в ОО программировании, связь между двумя объектами является одним из способов ссылки а, в то время как в реляционных моделях это двухсторонняя ссылка (вы можете перемещаться по отношениям с обеих сторон). Итак, в этом случае кажется, что родители содержат набор подкатегорий, но категория ничего не знает об этом родителе. Обычно рекомендуется установить обе стороны отношений. См. Этот пример из набора тестов Hibernate: https://github.com/hibernate/hibernate-core/blob/master/hibernate-core/src/test/java/org/hibernate/test/collection/set/PersistentSetTest.java – jpkrohling 2010-12-16 15:16:35

Смежные вопросы