我在冬眠中面临一个奇怪的问题。在多线程环境中操作,当尝试插入到其中一个表中时,在表中获得重复的条目。只有主键不同,其余所有其他字段都是完全重复的。
使用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);
}
检查您的数据持久性代码,以了解多线程可能存在的竞争条件。您正在检查是否存在RecipientInteractionBO
,它可能正在从数据库查询。如果两个线程同时运行,两个线程都检查它是否存在,因为对于两个线程都不存在,两个线程都保持新实体。您可能需要使用同步来使检查和插入/更新过程一次只对一个线程执行。
我的数据库中有这些(简化的)表 我已经用这两个(简化的)类映射了表 公司 如果我注释第26、28、30和32行(上面标记的),同样的代码可以完美地工作。但我想知道为什么会产生异常。为什么是复制的钥匙? 提前谢了。
问题内容: 我有一个由以下映射的关联: 我想使用Criteria API返回所有包含一个或多个带有attribute实体的实体的列表。我不希望映射集合被查询过滤。 例如,给出以下内容: 该查询应返回以下内容: 到目前为止,我正在使用以下条件查询: 然而,它返回的等价于 即,它为每个子元素返回一个父记录(填充了子集合) 有谁知道在这种情况下如何仅返回唯一的父元素? 意见表示赞赏,p。 问题答案: 您
我添加了以下代码以将记录插入/更新到表中 如果数据存在,它将更新表,否则将插入一个新记录,在我的情况下,数据已经存在,所以我首先更新记录,如果循环工作,但我得到 org.springframework.dao.DataIntegrityViolationException: key'umul_facebook_id_UNIQUE'的重复条目'482186425258498';SQL[n/a];约束
我有一个类,它将用一个数组中预先生成的所有员工填写一个列表。我可以用员工填充ArrayList,但唯一的问题是,我得到了一些“重复”条目,我使用引号是因为它们不完全相同,但它们可以共享相同的姓名或员工编号,但可能不具有相同的雇用年份或薪资等。 员工类别如下: 下面是将填充列表的generateList方法: “generateProductionWorker()和shiftSupervisor方法
我对冬眠很陌生。我正试图用hibernate制作我的第一个应用程序,结果遇到了下一个例外: NoClassDeffounderRror:javax/xml/bind/jaxbexception在org.hibernate.boot.cfgxml.internal.configloader$1。initialize(configloader.java:41)在org.hibernate.boot.c