【问题标题】:Duplicate entries in HibernateHibernate 中的重复条目
【发布时间】:2013-11-18 05:04:34
【问题描述】:

我在 Hibernate 中遇到了一个奇怪的问题。在多线程环境中操作,当尝试插入其中一个表时,会在表中获取重复条目。只有主键不同,其余所有字段都完全重复。

使用 Hibernate + Oracle 并使用 Spring - HibernateTemplate 对象。

这是我的 BO 类的相关部分,下面给出了保存对象的代码。不使用任何瞬态字段。

查看过与此相关的其他帖子,但没有一篇能解决问题的根本原因。我不想在 db 表上引入任何约束/唯一索引。

@Entity
@Table(name="ADIRECIPIENTINTERACTION")
@Lazy(value = true)
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
@GenericGenerator(name="recipientInteractionSeq", strategy = "native", parameters = 
{ @Parameter(name="sequence", value="SEQiRecipientInteractId")})
public class RecipientInteractionBO extends BusinessObject{ 
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(generator = "recipientInteractionSeq", strategy = GenerationType.AUTO)
    @Column(name="IRECIPIENTINTERACTIONID")     
    private long lId; ....

这是用于保存 BO 的代码。

-----------------------------------------------------
RecipientInteractionBO recInt = (RecipientInteractionBO) objectPS
                    .getUniqueResult(detachedCriteria);
if (recInt == null) {
 recInt = new RecipientInteractionBO();
 ....
 hibernateTemplateObj.insertObject(recInt);
} else {
  ...
   hibernateTemplateObj.saveOrUpdate(recInt);
}

如果需要任何其他详细信息,请告诉我。

【问题讨论】:

  • 你遇到的问题是不是只在多线程环境下才能看到?
  • 是的,这仅在多线程环境中。

标签: java spring hibernate jdbc


【解决方案1】:

检查您的数据持久性代码,了解多线程可能存在的竞争条件。您正在检查可能从数据库查询的RecipientInteractionBO 是否存在。如果两个线程同时运行,则都检查它是否存在,因为它们都不存在,都保留新实体。您可能需要使用同步来使检查和插入/更新的过程一次只为一个线程完成。

【讨论】:

  • 这个BO直接对应用户,不存在同一个用户可以来自两个不同线程的场景。所以,这不是问题。
  • 我的意思是,假设有两个线程 t1 和 t2。第一个线程 t1 检查数据库中的存在。它没有找到,所以它继续持久化一个新的,但在它可以提交其更改之前,线程 t2 还会检查并看到数据不存在,并且它还创建一个新的,因此两个实体被持久化。
  • 是的,所以我们的代码并非如此。没有两个线程在处理同一个用户。
  • 那么您可能需要启用休眠调试日志并查看日志以了解更多信息
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-03
  • 1970-01-01
  • 2015-01-01
  • 2017-06-19
  • 2014-05-30
  • 2016-07-12
  • 2015-06-25
相关资源
最近更新 更多