【问题标题】:Unique constraints and Hibernate唯一约束和休眠
【发布时间】:2011-12-11 10:43:21
【问题描述】:
我正在使用 Hibernate 3.6.4 和 MySQL。
我有一个对四列和其他 3 列具有唯一约束的表。当 UI 应用程序创建相应对象的新实例时,它可以使用表中已有值的这四个属性来创建它。结果,保存后,当然是 JDBC Exception of duplicate entry。
有没有办法告诉 Hibernate 不要插入新条目而是更新其余三列,或者在每次保存时我需要手动查询数据库以查看是否存在并相应地更新?
谢谢。
【问题讨论】:
标签:
mysql
hibernate
unique-constraint
【解决方案1】:
解决此问题的干净且独立于数据库的方法是首先检查此类实例是否存在,并根据该实例在您的应用程序逻辑中进行插入或更新。
也就是说,可能有一种方法可以利用记录在 here 中的 MySQL INSERT ... ON DUPLICATE KEY UPDATE 功能。在这种情况下,您必须为您的实体指定自定义 SQL INSERT 语句,如this related question 中所述。但是,这是否有效取决于您的实体 ID 的生成方式。看看this blog article关于这个问题。
一般来说,您必须处理 Hibernate认为持久化实例被持久化的问题的各个方面,而实际上持久化实例被更新。这可能是生成的实体 ID、其他生成的实体值、实体版本、并发性、预期的插入/更新行数、二级和查询缓存等问题。
所以,我认为虽然这将是一个很好的尝试,但我绝对不会在生产应用程序中使用此功能。
【解决方案2】:
您确实必须明确地获取具有四个唯一值的实体,如果存在则更新它,如果不存在则创建一个新的。没有办法解决这个问题。
顺便说一句,请注意,即使使用这样的机制,如果两个事务同时获取实体,发现它不存在,并且都尝试创建一个新实体,您最终可能会出现异常。