【问题标题】:Using Enum in Hibernate causes select followed by an update statement在 Hibernate 中使用 Enum 会导致 select 后跟 update 语句
【发布时间】:2011-01-07 14:42:36
【问题描述】:

我有一个映射实体,它有一个枚举属性。 通过查看日志文件,每当我在此类实体上运行 select 语句时,结果都是紧随其后的更新。 例如,如果我的结果集包含 100 条记录,那么我有:

[INFO org... select...]
[INFO org... update... where id=?]
[INFO org... update... where id=?]

....重复100次

如果我将该属性标记为 update=false,问题就会消失。 枚举是通过枚举转换器类分配的,我从一本著名的书中复制了该类。 所以我不知道我是否只是复制并粘贴代码。这是在 hbm 文件上声明的方式。

<typedef class="mypackage.HbnEnumConverter" name="the_type">
    <param name="enumClassname">mypackage.TheType</param>
</typedef>

你能指出一个调查的方向吗?此外,在休眠字段上设置 update=false 的后果是什么?

谢谢

【问题讨论】:

  • 据我了解,在“名著”中遗漏了usertype的家政方法,你确定你实现正确(尤其是equals(Object,Object))?

标签: hibernate enums


【解决方案1】:

如果您的对象标记为脏,Hibernate 将生成更新。

查看日志以查看 hibernate 是否将您的对象标记为脏。

如果你有类似下面的东西。

 class Entity{

   public YourEnum getEnum() {
    return yourEnum==null?YourEnum.SOME_VALUE:....;
   }
 }

或者也许在你的 Enum.equals 方法中你返回 false 可能等于(null,null)的情况?

如果比较的对象相同,equals 方法应该返回 true,否则返回 false,因为 hibernate 使用 equals 方法来判断对象是否脏。

【讨论】:

  • 你能告诉我更多关于equals(null,null)问题的细节吗?
  • 这不是特例,只是更容易出错的情况。 equals 方法应该返回正确的结果,以便可以正确地将对象标记为脏。
  • equals 方法应该在比较对象相同时返回 true,否则返回 false,因为 hibernate 使用 equals 方法来判断对象是否脏。
猜你喜欢
  • 1970-01-01
  • 2013-02-17
  • 1970-01-01
  • 2019-09-14
  • 1970-01-01
  • 2013-08-14
  • 1970-01-01
  • 2017-06-12
  • 2017-12-20
相关资源
最近更新 更多