Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.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 为什么hibernate在持久化由joined_子类继承类型映射的实体之前选择实体?_Java_Hibernate_Joined Subclass - Fatal编程技术网

Java 为什么hibernate在持久化由joined_子类继承类型映射的实体之前选择实体?

Java 为什么hibernate在持久化由joined_子类继承类型映射的实体之前选择实体?,java,hibernate,joined-subclass,Java,Hibernate,Joined Subclass,我有超类Person和两个子类Parent和Child。它们映射为联接的表继承类型 父对象和子对象具有双向一对多关系 Person.hbm.xml包含所有配置: <hibernate-mapping> <class name="com.masterhibernate.SimpleHibernateDemo.Person" table="Person"> <cache usage="read-write" />

我有超类Person和两个子类Parent和Child。它们映射为联接的表继承类型

父对象和子对象具有双向一对多关系

Person.hbm.xml包含所有配置:

<hibernate-mapping>
    <class name="com.masterhibernate.SimpleHibernateDemo.Person"
        table="Person">
        <cache usage="read-write" />

        <id name="id" column="id">
            <generator class="assigned" />
        </id>

        <property name="name">
            <column name="name" length="16" not-null="true" />
        </property>
        <property name="surname">
            <column name="surname" length="36"></column>
        </property>
        <property name="address">
            <column name="address" length="22"></column>
        </property>
        <joined-subclass name="com.masterhibernate.SimpleHibernateDemo.Parent"
            table="Parent">
            <key column="person_id" foreign-key="parent_person" />
            <property name="job" column="WorkPlace" length="22" type="string" />
            <set name="children" inverse="true" cascade="save-update" lazy="true">
                <cache usage="read-write" />
                <!-- specifies foreign key column of child table -->
                <key column="ParentPK" />
                <one-to-many class="com.masterhibernate.SimpleHibernateDemo.Child" />
            </set>
        </joined-subclass>
        <joined-subclass name="com.masterhibernate.SimpleHibernateDemo.Child"
            table="Child">
            <key column="person_id" foreign-key="child_person" />
            <property name="toy" column="toy" length="55" type="string" />
            <many-to-one name="parent"
                class="com.masterhibernate.SimpleHibernateDemo.Parent" column="ParentPK"
                foreign-key="child_parent" />
        </joined-subclass>
    </class>
</hibernate-mapping>

当我持久化父实体和关联子实体时,会在插入之前发出select语句。这些select语句从子表和人员表中查询子实体的数据

每次运行时都会重新创建数据库,并且没有可选择的内容

以下是从持久化父实体和关联子实体的主方法中提取的内容:

Parent parent = new Parent("Volodia", "Levytskyi", "Mykolaiv");
        parent.setId((long) 1);
        Set<Child> children = new HashSet<>();
        children.add(new Child((long) 2, "Ivan", "McGregor", "Odessa"));
        children.add(new Child((long) 3, "Borys", "McRobin", "Donetsk"));
        children.add(new Child((long) 4, "Nazar", "McCrespo", "Teernopil"));
        parent.setChildren(children);

        Session session = sessionFactory.openSession();
        Transaction transaction = session.beginTransaction();

        session.save(parent);
        // Criteria criteria = session.createCriteria(Person.class);
        // List<Person> list = criteria.list();
        // System.out.println("list1=" + list);
        transaction.commit();
        session.close();
<generator class="assigned" />
Parent Parent=new Parent(“Volodia”、“Levytskyi”、“Mykolaiv”);
父集合ID((长)1);
Set children=newhashset();
添加(新儿童((长)2,“伊万”、“麦格雷戈”、“敖德萨”);
添加(新儿童((长)3,“Borys”、“McRobin”、“Donetsk”);
添加(新儿童((长)4,“纳扎尔”、“麦克雷波”、“蒂尔诺皮尔”);
父母、子女(子女);
Session Session=sessionFactory.openSession();
事务=会话。beginTransaction();
session.save(父级);
//条件=session.createCriteria(Person.class);
//List=criteria.List();
//System.out.println(“list1=“+list”);
commit();
session.close();

为什么这些select语句在insert语句之前?

问题在于父实体和子实体的id生成器策略:

Parent parent = new Parent("Volodia", "Levytskyi", "Mykolaiv");
        parent.setId((long) 1);
        Set<Child> children = new HashSet<>();
        children.add(new Child((long) 2, "Ivan", "McGregor", "Odessa"));
        children.add(new Child((long) 3, "Borys", "McRobin", "Donetsk"));
        children.add(new Child((long) 4, "Nazar", "McCrespo", "Teernopil"));
        parent.setChildren(children);

        Session session = sessionFactory.openSession();
        Transaction transaction = session.beginTransaction();

        session.save(parent);
        // Criteria criteria = session.createCriteria(Person.class);
        // List<Person> list = criteria.list();
        // System.out.println("list1=" + list);
        transaction.commit();
        session.close();
<generator class="assigned" />