21

这个问题本质上与这个问题相反

我有这样的方法:

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

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

休眠 说:

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

我可以在我的isVacant()方法中添加一个注释来让 Hibernate 忽略它吗?

4

3 回答 3

42

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

引用Hibernate 文档

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

于 2012-09-10T20:58:18.530 回答
3

RNJ 是正确的,但我可能会补充为什么会发生这种情况:

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

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

于 2012-09-10T21:04:46.033 回答
0

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

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

于 2019-02-28T18:01:15.223 回答