在数据库级别,我们可以使用嵌入了存在查询的插入语句。
例如,
INSERT INTO MyTable (ID,Col1,Col2,...)
SELECT @IDValue,@Col1Value,@Col2Value, ...
WHERE NOT EXISTS (SELECT ID
FROM MyTable
WHERE ID=@IDValue)
SELECT * FROM MyTable Where ID=@IDValue
我们有什么办法可以通过Hibernate实现这一目标吗? Hibernate是否有任何逻辑,如果存在,只有存在以避免重复插入?
我们不想引入版本控制并寻找能够实现上述目标的解决方案。
感谢。
答案 0 :(得分:0)
实际上你可以使用SQLInsert注释:
@Entity
@Table(name="story_count")
@SQLInsert( sql="INSERT INTO story_count(id, view_count) VALUES (?, ?)
ON DUPLICATE KEY UPDATE set view_count = view_count + 1")
public class StoryCount
DUPLICATE KEY用于MySQL,你可以修改它以使用合并
编辑:实际上你可以在SQLInsert中使用一个过程,所以你需要为每个数据库创建一个过程
@SQLInsert(sql =“call PROC_ADD_USER(:P_ID,:P_COL1,:P_COL2,:P_COL3,...)”, 可调用=真)
但我知道,它仍然缺乏美感
答案 1 :(得分:0)
我实际上并不知道Hibernate本身是否支持这一点,但您想要的是,可能应该在数据库级别强制执行。只需在ID
列上创建唯一索引/约束即可。确切的语法因数据库而异,但在MySQL中可以尝试:
ALTER TABLE MyTable ADD UNIQUE (ID);
然后使用重复键进行插入会在数据库级别失败,并且您的Java代码应该准备好,可能是通过捕获异常。
答案 2 :(得分:0)
为了保持唯一性并避免约束异常,您可以在DAO级别进行检查,如下所示:
class MyTableDao extends SomeAbstractDao {
Integer save(MyTable myTable) {
Integer id = findBySomeFields(myTable);
return id != null ? id : save(myTable);
}
}