使用Hibernate和mySQL更新包含主键和唯一列的表

时间:2013-11-12 16:19:10

标签: 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` (`name`, `function`, `contact`)
)

从应用程序中我得到participants - 对象,这些对象可能包含namefunctioncontact的值,这些对象已经存在于数据库中。在这种情况下,我希望Hibernate为我提供该对象的id,否则我想保存该对象。

使用saveOrUpdate()我得到一个:

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

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

2 个答案:

答案 0 :(得分:1)

由于答案表明Hibernate不能独自完成它(真糟糕!)我解决了它本地sql"方式:

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);
}

像魅力一样!谢谢你们所有人!

答案 1 :(得分:0)

我不是Hibernate的专家。但是从Mysql的角度来看,你可以做到以下几点。

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

编辑:LAST_INSERT_ID()在这里错了。我编辑了答案。