Java 未保存到数据库的休眠问题
我有冬眠问题。我正在努力,但没有成功。我有一个模式,其中有类别、属性、属性选项。e、 例如,类别可以是“计算机”,其各自的属性可以是“RAM”、“硬盘”,例如,“RAM”可以有属性选项“512MB”、“1024MB” 当我使用hibernate尝试上述模式时,一切都正常 现在我还有一个要求。“类别”可以有许多子类别。e、 g.“计算机”可以将“笔记本电脑”或“笔记本电脑”作为子类别。现在,这些子类别属于类类别本身Java 未保存到数据库的休眠问题,java,hibernate,Java,Hibernate,我有冬眠问题。我正在努力,但没有成功。我有一个模式,其中有类别、属性、属性选项。e、 例如,类别可以是“计算机”,其各自的属性可以是“RAM”、“硬盘”,例如,“RAM”可以有属性选项“512MB”、“1024MB” 当我使用hibernate尝试上述模式时,一切都正常 现在我还有一个要求。“类别”可以有许多子类别。e、 g.“计算机”可以将“笔记本电脑”或“笔记本电脑”作为子类别。现在,这些子类别属于类类别本身 then I get this scheme: 1. Categ
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>
类别:
公共类类别实现了IsSerializable
{
私人长类别;
私有字符串CategoryName;
private Set SubCategory=new HashSet();
私有集AllAttributes=newhashset();
}
类别映射文件:
类属性:
公共类属性
{
私人长假;
私有字符串AttributeName;
私有集选项=新HashSet();
}
属性映射文件:
类属性选项:
公共类属性
{
私有长属性;
私有字符串选项;
私有字符串SQLValue;
}
属性映射文件:
我正在尝试以下方法。我没有收到任何错误,但它没有保存“笔记本电脑”,这是“电脑”的一个类别,否则一切都会被保存。因此,我认为问题在于类别映射文件中的这部分:
<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;
}
<?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>
这是我计划的一部分
类别C=新类别();
C.setCategoryName(“计算机”);
AttributeOption R512=新的AttributeOption();R512.设定期权(“512”);R512.设定值(“512”);
AttributeOption R1024=新的AttributeOption();R1024.设定期权(“1024”);R1024.设置QLvalue(“1024”);
类别C0=新类别();
C0.setCategoryName(“笔记本电脑”);
C.getSubCategory().add(C0);
属性RAM=新属性();
RAM.setAttributeName(“RAM”);
RAM.getOptions().add(R512);RAM.getOptions().add(R1024);
C.getAllAttributes().add(RAM);
事务tx=null;
尝试
{
tx=session.beginTransaction();
tx.begin();
会议.保存或更新(C);
tx.commit();
返回true;
}
捕获(例外e)
{
tx.回滚();
e、 printStackTrace();
返回false;
}
嗯,我认为这段代码有一些地方需要改进:
首先,应该使用persist()方法来持久化实体。
其次,要持久化整个对象图,必须a)手动持久化子对象,然后是“主”对象;或者b)在关系上使用Cascade参数,以便持久化“main”对象也会触发相关子对象的持久化
您可以在此处找到有关级联的更多信息:
这似乎有点问题:
C0.getSubCategory().add(C0);
难道不是:
C.getSubCategory().add(C0);
好的,我成功了
它的关键是类别映射文件:
<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;
}
<?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>
Ya,为了防止手动保存到数据库,我在每一个地方都放置了cascade额外的注释:注意,在OO编程中,两个对象之间的链接是单向链接,而在关系模型中是双向链接(您可以从两侧浏览关系)。因此,在本例中,父类似乎包含一组子类别,但该类别对其父类一无所知。通常,确定双方的关系是个好主意。请参阅Hibernate测试套件中的这个示例:实际上,这是一个更好的示例,因为它使用了对同一类对象的引用:我有一个新的映射文件。我现在的问题是,父类别和子类别之间没有联系。你是什么意思?代码或数据库中没有链接?如果在数据库中,您的意思是“parent_id”为空?通过查看您的代码,您似乎忘记了链接的另一面:C0.setParentCategory(C);