休眠约束 约束暴力异常。有没有一种简单的方法来忽略重复的条目?

2022-09-02 20:45:28

基本上,我有下面的架构,如果它们不存在,我会插入记录。但是,当涉及到插入副本时,它会像我预期的那样抛出错误。我的问题是,是否有一种简单的方法可以使Hibernate忽略实际上会插入重复项的插入?

CREATE TABLE IF NOT EXISTS `method` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(10) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `name` (`name`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;


SEVERE: Duplicate entry 'GET' for key 'name'
Exception in thread "pool-11-thread-4" org.hibernate.exception.ConstraintViolationException: could not insert:

答案 1

我的问题是,是否有一种简单的方法可以使Hibernate忽略实际上会插入重复项的插入?

Hibernate 怎么可能知道记录具有非唯一值,而不实际插入记录?

如果您正在执行批处理插入,并且不想回滚整个事务并在发生时丢弃会话(这是理论上在异常之后应该执行的操作,请参阅此线程前面的答案),我的建议是使用API并捕获.ConstraintViolationExceptionStatelessSessionConstraintViolationException


答案 2

休眠不能做到这一点。但是,您可以自己动手。基本上有两种选择:

  1. 插入前检查重复项;或
  2. 捕获约束暴力异常,然后确保冲突是由于重复引起的(因为可能还有其他原因,如空字段)。

前者的缺点是,当实际存在重复项的可能性可能较低时,您正在检查每个插入项上的重复项。对于没有重复的常见情况,后者会更快,但缺点是您需要在面部后检查重复项。当一个约束暴力异常被抛出时,它使当前会话无效;这意味着在执行重复项搜索之前,您需要刷新。

在插入之前检查重复项可能是最干净的方法,除非存在需要担心的重大性能问题。确保执行查找并插入事务,以确保有人不会在查找和插入之间添加重复项,否则您将获得 ConstraintViolationException。


推荐