Java 具有自定义类型更改的休眠字段,但对象未标记为';肮脏';更新
我有一个Hibernate模型,它使用自定义类型来表示布尔字段(即,模型有一个“boolean”对象,但数据库将0或1写入一个TINYINT字段。将布尔对象的值从(true改为false或false改为true)将更改对象上的值,但Hibernate会话管理器似乎认为该对象没有任何值更改,因此Java 具有自定义类型更改的休眠字段,但对象未标记为';肮脏';更新,java,hibernate,Java,Hibernate,我有一个Hibernate模型,它使用自定义类型来表示布尔字段(即,模型有一个“boolean”对象,但数据库将0或1写入一个TINYINT字段。将布尔对象的值从(true改为false或false改为true)将更改对象上的值,但Hibernate会话管理器似乎认为该对象没有任何值更改,因此save()实际上不会将SQL写入数据库 我是否需要在自定义类型中执行一些特殊的操作以使其看到更改?我更希望这样做,而不是强制每个对象在访问器中“脏”自己,但这也是可能的。首先,是否有任何理由使用自定义类型
save()
实际上不会将SQL写入数据库
我是否需要在自定义类型中执行一些特殊的操作以使其看到更改?我更希望这样做,而不是强制每个对象在访问器中“脏”自己,但这也是可能的。首先,是否有任何理由使用自定义类型而不是Hibernate的内置布尔类型
<property name="some_flag" type="boolean"/>
其次,不需要,您不需要在自定义类型中执行任何“特殊”操作,但需要正确实现其equals()
和deepCopy()
方法。您可以发布源代码吗?实际上不保存对象(或其更改)到数据库。它将其标记为持久性,即Hibernate认为已管理的对象。如果该对象已分离,请调用
你的工作完成了吗?和/或
您可能想再次检查上的Hibernate手册(我不是说这很讽刺;我今天也遇到了Hibernate的同样问题-忘记了
save()
和其他方法之间的区别,也忘记了flush()
我的会话)。有两种解决方案
@Entity
@Table(name = TABLE_NAME)
**@Access(AccessType.FIELD)**
public class EntityClass {
///---some fields
@Column(name = "CustomCol")
@Type(type = "com.something.CustomColType")
CustomClass customClass;
//--getters setters
}
当您的类中有自定义对象,并且您只修改该对象时,它不会标记为脏对象
- 解决方案1:使用customClass对象更新其他一些属性
- 解决方案2:将
放在customClass字段上,并为其提供getter/setter。 这将覆盖您在类级别上设置的默认@Access(AccessType.PROPERTY)
行为AccessType.Field
@Access(AccessType.PROPERTY)
,则此问题将不可复制