我在Hibernate中面临一个奇怪的问题。尝试插入多张表中的表时,在多线程环境中操作,获得表中的重复项。只有主键不同,其余所有其他字段都完全相同。

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

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

已经检查了与此相关的其他帖子,但是都没有解决问题的根本原因。我不想在数据库表上引入任何约束/唯一索引。

@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);
}


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

最佳答案

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

10-08 04:53