gpt4 book ai didi

java - Hibernate 生成器序列和分配给 id = 0 之间的内部差异

转载 作者:太空宇宙 更新时间:2023-11-04 13:53:23 24 4
gpt4 key购买 nike

内部 hibernate 的行为中有一些我不明白的东西。

我有一个类的正常 hibernate 配置,该类具有另一个引用。

下面是我的主要类(class)

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

我在这个引用表中有一些行:id 、属性 1、属性 20 val1x val2x
1 val1y val2y2 val1z val2z。.

我的问题是,当我尝试插入一个引用 MyReferenceClass 且 id 为 1,2,... 的 MyClass 的新实例时,我没有问题。但是当我尝试插入 id = 0 的一个时,出现以下异常:

org.hibernate.PropertyValueException: not-null property references a null or transient value: com.my.package.MyClass.myReference
at org.hibernate.engine.Nullability.checkNullability(Nullability.java:72)
at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:290)
at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:181)
at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:121)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:187)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:172)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:94)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)
at org.hibernate.impl.SessionImpl.fireSaveOrUpdate(SessionImpl.java:507)

我通过将生成器类从序列更改为在 MyReferenceClass.hbm.xml 中分配来解决了问题:

<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 框架的这一部分中,我不理解哪种机制?

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

最佳答案

MyReferenceClass 的 id 映射的 unsaved-value 属性似乎默认为 0,并且未为 MyClass 启用级联更新。

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

将生成器更改为“已分配”意味着您承担填充 id 的全部责任,并且 Hibernate 不必担心它。

要使用序列生成器进行此操作,您可以在将对象添加到集合之前保存对象,或者在集合的映射上设置级联。

关于java - Hibernate 生成器序列和分配给 id = 0 之间的内部差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30079227/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com