【问题标题】:How to make Hibernate ignore a method?如何让 Hibernate 忽略一个方法?
【发布时间】:2012-09-03 18:31:12
【问题描述】:

这个问题本质上与this one相反。

我有这样的方法:

public boolean isVacant() {
    return getEmployeeNum() != null && getEmployeeNum().equals("00000000");
}

当我加载它时,Hibernate 抱怨我没有名为vacant 的属性。但我不想要一个名为 vacant 的属性 - 我不需要存储该数据 - 这只是逻辑。

休眠说:

org.hibernate.PropertyNotFoundException:在 com.mycomp.myclass 类中找不到属性空置的设置器...

我可以在isVacant() 方法中添加注释以使 Hibernate 忽略它吗?

【问题讨论】:

    标签: java hibernate


    【解决方案1】:

    @Transient 添加到方法中,然后Hibernate 应该忽略它。

    引用Hibernate Documentation

    实体的每个非静态非瞬态属性(字段或方法取决于访问类型)都被认为是持久的,除非您将其注释为@Transient

    【讨论】:

      【解决方案2】:

      RNJ 是正确的,但我可能会补充一下为什么会这样:

      我猜你已经注释了你的持久类的吸气剂。 java bean 使用的前缀是“set”和“get”,用于读取和写入变量,但也有前缀“is”,用于布尔值(而不是“get”)。当 Hibernate 看到你的 getter-annotated 持久类并找到一个方法“isVacant”时,它假定有一个属性“空缺”,并假定还有一个“set”方法。

      因此,要修复它,您可以添加@Transient 注释,或者您可以将方法名称更改为不以“is”开头的名称。如果您的类在字段上而不是 get-methods 上注释,我认为这不会是一个问题。

      【讨论】:

      • 重命名方法的问题在于,这也违反了约定。按照惯例,返回布尔值(无论它们是否是成员)的方法以 is 或 has 开头。考虑 java.util.Collection 方法 isEmpty() - 大多数集合不存储它们是否为空 - 它们将它们的大小与 0 进行比较。(这并非适用于所有集合,例如 ConcurrentLinkedQueue,但它适用于大多数,以至于AbstractCollection 就这样实现了它。)
      【解决方案3】:

      许多框架(如 Hibernate 和 Drools)都非常聪明,他们知道布尔变量需要通过“is”而不是“get”来访问。但他们并不总是完全理解,这就是“有趣”问题可能出现的时候。或者,更糟糕的是,不同的框架对方法的解释略有不同,它们应该一起工作。

      顺便说一句,@Transient 解决方案不能保证解决您的所有问题。最值得注意的是,假设您将它添加到返回一个巨大而复杂的对象的 toString() 中。您可能会遇到堆栈溢出,这不是因为该方法庞大而复杂,甚至不是因为所有子对象都有自己的 toString() 方法,而是因为您的结构具有循环结构。这就是导致堆栈溢出的原因。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-09-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多