这个问题基本上与this one相反。
我有一个像这样的方法:
public boolean isVacant() {
return getEmployeeNum() != null && getEmployeeNum().equals("00000000");
}
当我加载它时,Hibernate抱怨我没有名为vacant
的属性。但是我不想要一个名为vacant
的属性 - 我不需要存储那些数据 - 它只是逻辑。
Hibernate说:
org.hibernate.PropertyNotFoundException:在com.mycomp.myclass类中找不到属性空置的setter ...
是否有我可以添加到isVacant()
方法的注释以使Hibernate忽略它?
答案 0 :(得分:32)
将@Transient
添加到方法中,然后Hibernate应该忽略它。
实体的每个非静态非瞬态属性(字段或方法取决于访问类型)都被视为持久性,除非您将其注释为
@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()方法,而是因为您的结构具有圆形结构。这就是导致堆栈溢出的原因。