Hibernate如何向数据库添加新的布尔类型列

5

我试图使用注解来向其中一个表中添加一个新的bool类型列,我尝试了:

@Column(name = "selected", nullable = true)

private boolean selected;

然后我添加了getter/setter,但是当我运行应用程序时,我收到以下错误:

Exception occurred inside setter of com.ingens.warranty.model.WarrantyCase.warrantyDetail; nested exception is org.hibernate.PropertyAccessException: Exception occurred inside setter of com.ingens.warranty.model.WarrantyCase.warrantyDetail

我对Hibernate还很陌生,虽然我的问题可能是一个初学者的问题,但它让我卡住了。

谢谢。

编辑:

好的,我在错误堆栈中找到了这个错误:Unknown column 'warrantyse14_.selected' in 'field list',显然该列未被创建,并且SQL select命令正在使用该列,但实际上该列不存在,因此我认为注释由于某种原因不起作用,它在我运行应用程序后没有创建该列。


2
可能是“可空数据库列被映射到基元类型属性”。请在此处查看:http://www.dil.univ-mrs.fr/~massat/docs/hibernate-3.1/api/org/hibernate/PropertyAccessException.html - Ghokun
谢谢指出,我简直不敢相信我居然错过了这个问题,所以我已经将其更改为@Column(name = "selected", nullable = false, columnDefinition="boolean defaule false"),但错误仍然存在。添加新列时确切发生了什么?也许我的注释是错误的?但无论如何,感谢您的快速回复。 - arash moeen
问题出在WarrantyCase中的另一个字段(warrantyDetail)的getter和setter方法。 - rajesh kakawat
谢谢Rajesh,但那是我检查的第一个地方,它基本上是读取保修案例的对象属性,我尝试过调试,但它在读取属性之前就深入到框架中了,这使得我很难追踪,因为我对Hibernate非常陌生。我将尝试注释getter中的所有内容,看看能否找出到底发生了什么...无论如何还是谢谢。 - arash moeen
1个回答

5

private boolean selected; 改为 private Boolean selected;

我认为发生这种情况的原因是Hibernate尝试将映射列中的null值设置到primitive类型的selected字段中,因此会出现异常。如果该字段被设置为Object而不是primitive类型,则不会发生这种情况。

与模式更新/验证(hbm2ddl)一起使用时,列定义很有用,并且映射没有涵盖单独定义新字段的情况。在这种情况下,您需要发出两个语句:

"alter table ... add column selected ..."

"update ... set selected = false where selected is null"

为了触发自动的Hibernate模式更新(例如应用 @ColumnDefinition),您需要将以下Hibernate属性添加到persistence.xml提供程序属性中(如果使用JPA),或者作为hibernate.cfg.xml中的属性(如果仅使用Hibernate):hibernate.hbm2ddl.auto=update


我已经将默认值设置为false,因此使用Boolean或boolean应该没有任何区别,除了Boolean比boolean占用更多的内存。但无论如何,它都没有起作用,谢谢。 - arash moeen
我认为发生的情况是Hibernate尝试将所选映射列中的null值设置到所选字段中,因此出现了异常。如果该字段被设置为Object,则不会发生这种情况。另一个选择是在所选列为空时填充所选列:“update ... set selected = false where selected is null”。 - Ori Dar
是的,这正是我第一次阅读您的答案时的想法,老实说,在回答您之前我确实尝试了它,但是 columnDefinition="boolean defaule false" 不应该将所选列的值默认设置为 false 吗?再次感谢您的回复。 - arash moeen
1
列定义适用于模式生成(hbm2ddl)。无论如何,映射并未涵盖您定义新列但未使用更新语句设置默认值的情况。在这种情况下,尝试将null值“注入”到基本类型中会导致此类错误。 - Ori Dar
columnDefinition="boolean defaule false" 的映射仅在您将 hibernate 属性 hibernate.hbm2ddl.auto 设置为除“validate”以外的值时才触发模式更改。是的,我的意思是您应该将所有列的空值更新为 false(或 true)。 - Ori Dar
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接