如何让Hibernate忽略一个方法?

时间:2012-09-10 20:57:19

标签: java hibernate

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

我有一个像这样的方法:

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

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

Hibernate说:

  

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

是否有我可以添加到isVacant()方法的注释以使Hibernate忽略它?

3 个答案:

答案 0 :(得分:32)

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

引用Hibernate Documentation

  

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

答案 1 :(得分:3)

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

我猜你已经注释了持久类的getter。 java bean使用的前缀是“set”和“get”,它们用于对变量进行读写操作,但也有前缀“is”,它用于布尔值(而不是“get”)。当Hibernate看到你的getter-annotated持久化类,并找到一个方法“isVacant”时,它假定有一个属性为“vacant”,并假设还有一个“set”方法。

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

答案 2 :(得分:0)

许多框架(例如Hibernate和Drools)非常聪明,他们知道布尔变量需要由“ is”而不是“ get”访问。但是他们并不总是能完全理解,那就是“有趣”的问题可能发展的时候。或者,更糟糕的是,不同的框架对方法的解释略有不同,并且应该一起使用。

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