Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 未保存到数据库的休眠问题_Java_Hibernate - Fatal编程技术网

Java 未保存到数据库的休眠问题

Java 未保存到数据库的休眠问题,java,hibernate,Java,Hibernate,我有冬眠问题。我正在努力,但没有成功。我有一个模式,其中有类别、属性、属性选项。e、 例如,类别可以是“计算机”,其各自的属性可以是“RAM”、“硬盘”,例如,“RAM”可以有属性选项“512MB”、“1024MB” 当我使用hibernate尝试上述模式时,一切都正常 现在我还有一个要求。“类别”可以有许多子类别。e、 g.“计算机”可以将“笔记本电脑”或“笔记本电脑”作为子类别。现在,这些子类别属于类类别本身 then I get this scheme: 1. Categ

我有冬眠问题。我正在努力,但没有成功。我有一个模式,其中有类别、属性、属性选项。e、 例如,类别可以是“计算机”,其各自的属性可以是“RAM”、“硬盘”,例如,“RAM”可以有属性选项“512MB”、“1024MB” 当我使用hibernate尝试上述模式时,一切都正常

现在我还有一个要求。“类别”可以有许多子类别。e、 g.“计算机”可以将“笔记本电脑”或“笔记本电脑”作为子类别。现在,这些子类别属于类类别本身

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);