【问题标题】:Hibernate add new boolean column to databaseHibernate 将新的布尔列添加到数据库
【发布时间】:2013-03-21 19:06:34
【问题描述】:

我正在尝试使用注释向其中一个表中添加一个新的 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 命令正在使用该列,该列不存在,所以我假设注释不起作用出于某种原因,它只是在我运行应用程序后不创建列。

【问题讨论】:

  • 可能这个“一个可以为空的数据库列被映射到一个原始类型的属性”。在这里查看dil.univ-mrs.fr/~massat/docs/hibernate-3.1/api/org/hibernate/…
  • 感谢您指出这一点,我不敢相信我真的错过了,所以我将其更改为@Column(name = "selected", nullable = false, columnDefinition="boolean defaule false"),但错误仍然存​​在。何时更改表以添加新列?也许我的注释是错误的?但无论如何感谢您的快速回复。
  • 问题出在其他字段(WarrantyCase 中的warrantyDetail)getter 和setter 上
  • 感谢 rajesh,但这是我检查的第一个地方,它基本上是在读取我尝试调试的保修案例的对象属性,但它甚至在读取属性之前就深入到了框架中这让我有点无法追踪,因为我对休眠真的很陌生。我会尝试评论该吸气剂中的所有内容,看看我是否能找出到底发生了什么......无论如何,谢谢

标签: database hibernate


【解决方案1】:

改变 private boolean selected;

private Boolean selected;

我认为发生的情况是 Hibernate 尝试将所选映射列中的空值设置为所选字段,这是原始的,因此是例外。如果该字段已设置为 Object,则不会发生这种情况。

列定义与架构更新/验证 (hbm2ddl) 结合使用非常有用,并且映射不涵盖您自己定义新字段的情况。在这种情况下,您必须发出两条语句:

“更改表...添加选定的列...”

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

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

【讨论】:

  • 我已经将默认值设置为 false,因此使用布尔值或布尔值应该没有什么不同,除了布尔值比布尔值占用更多内存。但无论如何它没有工作,但谢谢
  • 我认为发生的事情是 Hibernate 尝试将选定映射列中的空值设置到选定字段中,这是原始的,因此是例外。如果该字段已设置为 Object,则不会发生这种情况。另一种选择是填充您选择的列,它是空的:“更新...设置选择=假,选择为空”
  • 是的,这正是我第一次阅读您的答案时的想法,老实说,在回答您之前我确实先尝试过,但 columnDefinition="boolean defaule false" 不应该将所选列的值设置为 false 作为默认值吗?再次感谢您的回复。
  • 列定义适用于模式生成 (hbm2ddl)。无论如何,映射不包括您定义新列并且不使用更新语句设置默认值的情况。在这种情况下,尝试将空值“注入”原始类型会导致此类错误
  • 好的,现在我不知道,我很感激你。所以基本上你要说的是,如果我只是改变表并添加列并用假值更新它会更好? (对不起,如果我弄错了或其他什么),如果我做对了,那么使用注释完成的映射是否将属性映射到 db 中的字段?再次感谢您的快速回复和帮助
猜你喜欢
  • 2014-06-13
  • 2014-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-12
相关资源
最近更新 更多