我正在使用Hibernate 3.6.4和MySQL 我有一个表,在四列和另外三列上有唯一约束。当UI应用程序创建相应Object的新实例时,它可以使用表中已有值的这四个属性创建它。保存时的结果当然是重复条目的JDBC异常。
有没有办法告诉Hibernate不插入新条目但更新三列的其余部分,或者每次保存时我需要手动查询数据库以查看是否存在并相应更新?
感谢。
答案 0 :(得分:2)
针对此问题的清除且独立于数据库的方法是首先检查是否存在此类实例,并根据应用程序逻辑中的插入或更新。
也就是说,可能有一种方法可以利用记录here的MySQL INSERT ... ON DUPLICATE KEY UPDATE
功能。在这种情况下,您必须为您的实体指定自定义SQL INSERT语句,如this related question中所述。但是,如果这可行,则取决于生成实体ID的方式。关于这个问题,请查看this blog article。
通常,您必须处理Hibernate 认为暂时性实例的问题的每个方面,实际上是持久化实例的更新。这可能是生成的实体ID,其他生成的实体值,实体版本,并发性,预期的插入/更新行数,第二级和查询缓存等问题。
所以,我认为虽然这是一个很好的实验,但我绝对不会在生产应用程序中使用此功能。
答案 1 :(得分:1)
您确实必须明确地获取具有四个唯一值的实体,然后更新它(如果存在)或创建新实体(如果不存在)。没有办法解决这个问题。
BTW,请注意,即使有这样的机制,如果两个事务同时获得实体,发现它不存在,并且两者都试图创建一个新事件,那么最终可能会出现异常。