Java 使用Hibernate和mySQL使用主键和唯一列更新表

Java 使用Hibernate和mySQL使用主键和唯一列更新表,java,mysql,hibernate,Java,Mysql,Hibernate,我有一个包含四列的表: CREATE TABLE `participants` ( `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, `name` VARCHAR(128) NOT NULL, `function` VARCHAR(255) NOT NULL, `contact` VARCHAR(255) NOT NULL, PRIMARY KEY (`id`), UNIQUE INDEX `name_function_contact` (

我有一个包含四列的表:

CREATE TABLE `participants` (
 `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
 `name` VARCHAR(128) NOT NULL,
 `function` VARCHAR(255) NOT NULL,
 `contact` VARCHAR(255) NOT NULL,
 PRIMARY KEY (`id`),
 UNIQUE INDEX `name_function_contact` (`name`, `function`, `contact`)
)
从应用程序中,我得到了
参与者
-对象,这些对象可能有
名称
函数
联系人
的值,这些值已经存在于数据库中。在本例中,我希望Hibernate为我获取该对象的
id
,否则我希望保存该对象

使用
saveOrUpdate()
我刚刚得到一个:

org.hibernate.exception.ConstraintViolationException: Duplicate entry 'NAME-FUNCTION-CONTACT: NAME' for key 'name_function_contact'

我怎样才能做到这一点?非常感谢

我不是冬眠专家。但从Mysql的角度来看,您可以执行以下操作

使用
INSERT IGNORE to…
在表中添加值。如果插入的行数为0,则可以通过
SELECT
语句手动获取行的ID


编辑:上次插入的ID()错误。我已经编辑了答案。

因为答案表明Hibernate无法独立完成(糟糕!),我用“本机sql”的方式解决了它:


工作起来很有魅力!谢谢大家

您的应用程序必须首先查询数据库以提取与这3个字段匹配的任何对象,从而自己完成这项工作。如果找不到对象,则调用save。否则,使用刚找到的id设置对象的id,并调用save。(我删除了我的第一条评论,因为我重新阅读了问题,意识到你已经理解了我键入的内容)。你的另一个选择是插入并忽略错误,但如果对象中有其他字段需要更新,则此方法不起作用,因为这些其他字段将不会更新。确定。是否快速n脏:
对于(参与者p:Participants){try{session.save(p);}catch(ConstraintViolationException e){p.setId(((参与者)session.createQuery)(“来自参与者,其中名称为''+p.getName()+'',函数为'+p.getFunction()+'',联系人为'+p.getContact()+'').uniqueResult()).getId();}最后{}
别忘了在catch{}块中再次调用session.save(p)。此外,我建议使用name=和function=以及contact=以提高清晰度/性能,而不是使用LIKE。如果这对你有用的话,你可能想把它作为一个答案贴出来。结果做的稍微不同。请参阅我的回答只要参与者对象在保存时没有任何需要持久化的额外内部数据,这样做就很有效。很高兴你有一个简明的解决方案,工作!对。但它没有:)再次感谢所有的帮助!
Participants tempParti = ((Participants) session.createQuery("FROM Participants WHERE name = '" + p.getName() + "' AND function = '" + p.getFunction() + "' AND contact = '" + p.getContact() + "'").uniqueResult());
if (tempParti != null) {
    p = tempParti;
} else {
    session.save(p);
}