无法在persist方法中修改列 - Hibernate Trigger

时间:2018-05-15 19:17:09

标签: hibernate triggers

我想使用entityManager.persist(entity)方法插入带有Hibernate的记录;但抛出这个错误:

Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: The column can not be modified "TABLE_FIELD" because it is a calculated column or is the result of a UNION operator.
    at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:258)
    at com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(SQLServerStatement.java:1535)

如果我尝试插入记录,为什么会显示“无法修改列”?

信息
- 我正在使用jdk 1.7,Spring 4.3.10.RELEASE和Hibernate 4.3.11.Final
- 当我直接在BD SQL Server中运行INSERT时,我可以插入新记录
- 指示错误的字段为NULL,但在插入NULL时应退出错误,而不是日志显示的内容 - 显然数据库中有一个hibernate无法处理的触发器

提前感谢您的回答

1 个答案:

答案 0 :(得分:1)

如果映射中的列只由数据库驱动,则应在映射中指明,以便Hibernate不在其DML语句中包含它。

@Generated(value = GenerationTime.ALWAYS)
@Column("some_calculated_field", insertable = false, updatable = false)
private String someCalculatedField;

如您所见,我已将其标记为insertable=falseupdatable=false,以便在生成INSERTUPDATE语句时有效跳过该字段。这应该可以解决触发问题。

更新

我更新了映射以包含@Generated以解决您的空值问题。

使用GenerationTime.ALWAYS时,将在SELECTINSERT之后调用UPDATE语句,以从数据库中获取计算列的值。如果触发器仅在INSERT期间触发,则可以通过将注释更改为UPDATE来提高GenerationType.INSERT性能,以便SELECT语句仅在INSERT上触发