hibernate在同一事务中插入ignore

时间:2014-04-25 06:32:58

标签: hibernate jpa duplicates ignore

我是从韩国写的。

之前从未问过,

所以..如果你认为我的语法不好,我将不胜感激。

  

我正在使用JPA2 + Hibernate 3.使用MYSQL作为Db。

以下是Class TestB。

@SQLInsert(sql = "INSERT IGNORE INTO testB (....) VALUES (?,?,?,?,?,?) ;")
Class TestB{
  @GeneratedValue(strategy=GenerationType.IDENTITY)
  @ID
  private long id;

  @Column(unique)
  String ccc; 
}

对于交易开始..

@Transactional

List<TestB> list = ...
repoitory.save(list);

但不幸的是,这是批量插入,因此我无法将每个数据保存在内存中。

我选择做的只是将数据传递给DB 和DB决定做什么。

对于纯SQL, INSERT IGNORE工作正常。

但是对于休眠......我尝试了两件事。

1. Insert Ignore
2. Insert .. on duplicate update (...)

两者都不起作用

每个人的错误,

1. The database returned no natively generated identity value.
2. NonUniqueObject Exception.

两者都发生在重复条目中,而不是第一条。

我认为错误:1是因为,

插入后,hibernate应该为代理对象分配ID,但它不能......

我认为错误:2是由, 具有相同id的两个对象不能存在于同一会话中。

然后我该如何解决这个问题? 这是可以理解的吗?? ??

提前致谢〜!!!

1 个答案:

答案 0 :(得分:1)

在第一种情况下,如果没有约束违规或sql错误,hibernate会尝试将数据插入表中。如果有任何例外(比如唯一键违规...),因为你已经使用过INSERT IGNORE DB不会在数据库中插入任何东西,所以没有本地生成的ID; Hibernate抛出系统异常,错误为The database returned no natively generated identity value

解决方案之一:处理此错误的一种方法是捕获HibernateSystemException,它在插入失败时被抛出并被MySQL DB忽略。

由于这是一个hibernate系统异常,因此即使其中一个忽略失败,Hibernate内部也似乎将事务标记为回滚。我也试图找到解决方案。