以下是与错误相关的简化代码:
@Entity
@Table(name = "ms_filter", uniqueConstraints=@UniqueConstraint(columnNames = { "ms_id" }))
public class MSFilter
@OneToOne
private MS ms;
您可以看到ms_id存在约束。
创建此类的新实例。 ms字段设置为值(MS),其中sqlId(它的主键)等于" 1649809",此字段映射到ms_id。此时已经有另一个MSFilter指向同一个MS,这两个实例都已经提交了很长时间。
然后我将字段ms的值更改为另一个MS,其中sqlId等于1618544(此会话中的新MS)。这是通过反射完成的,调用了setter方法。
然后调用提交。但我可以看到Hibernate尝试保存新实体,但使用旧的MS值。这是我在提交之前添加的日志。列出了会话的所有MSFilters实例(我已将日志放在构造函数中进行检查)。
ref:[1] ms_id 1649627 filter_id 1657507 unique_key -2011976030:-1667727498:3:6 user_id null user_profile null id 1657509
ref:[2] ms_id 1649809 filter_id 1657507 unique_key 13321113:-1720593839:2:3076 user_id null user_profile null id 1659533
当前:[3] ms_id 1618362 filter_id 1626084 unique_key 1196133270:-1667727498:3:6 user_id null user_profile null id 1628109
当前:[4] ms_id 1619159 filter_id 1626084 unique_key 1196133270:-1667727498:1:2 user_id null user_profile null id 1628108
当前:[5] ms_id 1618544 filter_id 1626084 unique_key 1196133270:null user_id null user_profile null id 1659620
我确实激活了Hibernate日志,这是第一个也是唯一一个SQL语句:
2015-04-01 01:55:53 DEBUG SQL:109 - 插入ms_filter(ms_id,filter_id,unique_key,user_id,user_profile,id)值(?,?,?,?,?,?)
2015-04-01 01:55:53 TRACE BasicBinder:81 - 绑定参数[1]为[INTEGER] - [1649809]
2015-04-01 01:55:53 TRACE BasicBinder:81 - 绑定参数[2]为[INTEGER] - [1626084]
2015-04-01 01:55:53 TRACE BasicBinder:81 - 将参数[3]绑定为[VARCHAR] - [1196133270:null]
2015-04-01 01:55:53 TRACE BasicBinder:69 - 绑定参数[4]为[VARCHAR] - [null]
2015-04-01 01:55:53 TRACE BasicBinder:69 - 绑定参数[5]为[VARCHAR] - [null]
2015-04-01 01:55:53 TRACE BasicBinder:81 - 绑定参数[6]为[INTEGER] - [1659620]
正如您所见,Hibernate尝试插入实例[5](如果我考虑" id"列)。但" ms_id"的价值不是好人吗?当然,独特的约束不受尊重,交易失败。
是什么导致这种情况?