Java 休眠为id=0分配的生成器序列和之间的内部差异
我不明白内在冬眠的行为中有什么东西 我有一个正常的hibernate配置,一个类引用了另一个类 我的主要班级在下面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-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>