我想使用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无法处理的触发器
提前感谢您的回答
答案 0 :(得分:1)
如果映射中的列只由数据库驱动,则应在映射中指明,以便Hibernate不在其DML语句中包含它。
@Generated(value = GenerationTime.ALWAYS)
@Column("some_calculated_field", insertable = false, updatable = false)
private String someCalculatedField;
如您所见,我已将其标记为insertable=false
和updatable=false
,以便在生成INSERT
和UPDATE
语句时有效跳过该字段。这应该可以解决触发问题。
更新
我更新了映射以包含@Generated
以解决您的空值问题。
使用GenerationTime.ALWAYS
时,将在SELECT
和INSERT
之后调用UPDATE
语句,以从数据库中获取计算列的值。如果触发器仅在INSERT
期间触发,则可以通过将注释更改为UPDATE
来提高GenerationType.INSERT
性能,以便SELECT
语句仅在INSERT
上触发