Hibernate是否有任何像DB插入的逻辑,只有存在以避免重复插入?

时间:2017-07-20 11:47:21

标签: hibernate

在数据库级别,我们可以使用嵌入了存在查询的插入语句。

例如,

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是否有任何逻辑,如果存在,只有存在以避免重复插入?

我们不想引入版本控制并寻找能够实现上述目标的解决方案。

感谢。

3 个答案:

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