Java 休眠为id=0分配的生成器序列和之间的内部差异

Java 休眠为id=0分配的生成器序列和之间的内部差异,java,hibernate,generator,Java,Hibernate,Generator,我不明白内在冬眠的行为中有什么东西 我有一个正常的hibernate配置,一个类引用了另一个类 我的主要班级在下面 <hibernate-mapping package="com.my.package"> <class name="MyClass" table="MY_TABLE"> <id name="id" column="ID"> <generator class="sequ

我不明白内在冬眠的行为中有什么东西

我有一个正常的hibernate配置,一个类引用了另一个类

我的主要班级在下面

<hibernate-mapping package="com.my.package">

        <class name="MyClass" table="MY_TABLE">
            <id name="id" column="ID">
                <generator class="sequence">
                    <param name="sequence">SEQ_MY_TABLE</param>
                </generator>
            </id>
            <!-- reference -->
            <many-to-one class="MyReferenceClass" fetch="select" name="myReference">
                <column name="ID" not-null="true"/>
            </many-to-one>
            <!-- some other properties ... -->
            .
            .
    </class>
</hibernate-mapping>
<hibernate-mapping package="com.my.package">
    <class name="MyReferenceClass" table="MY_REFERENCE_CLASS">
        <id name="id" type="long">
            <column name="ID" precision="22" scale="0" />
            <generator class="sequence" />
        </id>
    </class>

    <!-- Some propeties -->
    .
    .

</hibernate-mapping>
我通过将生成器类从sequence更改为MyReferenceClass.hbm.xml中的assigned,解决了这个问题:

<hibernate-mapping package="com.my.package">
        <class name="MyReferenceClass" table="MY_REFERENCE_CLASS">
            <id name="id" type="long">
                <column name="ID" precision="22" scale="0" />
                <generator class="assigned" />
            </id>
        </class>

        <!-- Some propeties -->
        .
        .

</hibernate-mapping>

.
.
问题是我不知道为什么只有当我的id=0时它才起作用,而不是每次都起作用

在Hibernate框架的这一部分中,我不理解哪一个mecanism


PS:我知道我的第一个文件中的序列是错误的,因为我们这里没有序列,这实际上是我正在开发的一个旧的遗留代码,但我不明白它以前为什么工作。

看起来MyReferenceClass的id映射的未保存值属性默认为0,MyClass未启用和级联更新

添加id不是未保存值的对象时,Hibernate假定您正在引用现有行。当您添加一个id与未保存值匹配的对象时,Hibernate会假定该实体是暂时的,需要持久化以从序列中获取新值。由于集合不是级联的,Hibernate假定引用是对现有的非瞬态实体的引用

将生成器更改为“assigned”意味着您承担了填充id的全部责任,Hibernate将不必担心它


要使用序列生成器实现这一点,可以在将对象添加到集合之前保存对象,或者在集合的映射上设置级联

好的!我完全不知道这个未保存的值属性,但现在它更有意义了。谢谢你的回答。
<hibernate-mapping package="com.my.package">
        <class name="MyReferenceClass" table="MY_REFERENCE_CLASS">
            <id name="id" type="long">
                <column name="ID" precision="22" scale="0" />
                <generator class="assigned" />
            </id>
        </class>

        <!-- Some propeties -->
        .
        .

</hibernate-mapping>