当前位置: 首页 > 知识库问答 >
问题:

使用JTA的Eclipselink找不到新插入的实体,并引发重复键异常

束志业
2023-03-14
public Eom() {
}


@Id
@Column(unique=true, nullable=false, length=150)
public String getProjectname() {
    return this.projectname;
}

public void setProjectname(String projectname) {
    this.projectname = projectname;
}

@stateless@singleton公共类EomDao实现EomDaoLocal{

private @PersistenceContext(unitName = "emiClearQuestAdapterPersistancy")
EntityManager em;

@Override
public void storeEom(Eom eom) {
    em.persist(eom);
}

@Override
public void updateEom(Eom eom) {
    em.merge(eom);
}

@Override
public void deleteEom(Eom eom) {
    em.remove(eom);
}

@Override
public Eom getEomByProjectName(String projectName) throws NotFoundException {
    em.getEntityManagerFactory().getCache().evictAll();
    return em.find(Eom.class, projectName);
}

@Override
public boolean existsEom(String projectName) {
    try {
        if (this.getEomByProjectName(projectName) != null) {
            return true;
        } else {
            return false;
        }
    } 
    catch (NotFoundException e) {
        return false;
    }
}

}

还有门面

@Stateless@Singleton公共类DefectListFacade实现DefectListFacadeLocal{

private @EJB
DefectDaoLocal defectdao;
private @EJB
EomDaoLocal eomdao;

@Override
public void insertdefect(CQDefect defect) {

    String projectName = defect.getFehlerprojektnummer().getLabel();

    Eom eom = new Eom();
    eom.setProjectname(projectName);

    Defect domaindefect = new Defect();
    List<Defect> defectlist = new ArrayList<Defect>();

    transferJsonToDomain(domaindefect, defect);
    domaindefect.setEom(eom);
    defectlist.add(domaindefect);
    eom.setDefects(defectlist);

    eomdao.storeEom(eom);

    Logger.getLogger(DefectListFacade.class.getName()).info(
            "EOM -- INSERTED " + eom.getProjectname());
}

@Override
public void updatedefect(CQDefect defect) {

    String projectName = defect.getFehlerprojektnummer().getLabel();

    Logger.getLogger(DefectListFacade.class.getName()).info(
                "EOM -- UPDATED " + projectName);
}

这是我的留言

@Override
public void receiveMessage(BaseMessage message) {
    if (message instanceof FehlerMessage) {
        FehlerMessage fehlermsg = (FehlerMessage) message;
        if (eomdao.existsEom(fehlermsg.getEom())) {
            defectlistfacade.updatedefect(fehlermsg.getFehler());
        } else {
            defectlistfacade.insertdefect(fehlermsg.getFehler());
        }
        Logger.getLogger(FehlerMessageReceiver.class.getName()).fine(
                fehlermsg.getEom() + " - "
                        + fehlermsg.getFehler().getFehler_Titel());
        monitoring.notifyEMDBMessageReceive(BusType.Base,
                message.getTypeIdentifier(), message.getSize());
    }
}

按照克里斯说的去做之后,我发现了正在发生的事情。这是一种种族条件。

[#2014-03-27T11:22:39.051+0100InfoglassFish3.1.2com.generali.tools.myemi.components.clearquest.crud.facade.defectListFacade_Threadid=2603;_ThreadName=Thread-10;EOM--已插入PRJ-00359#]

[#2014-03-27T11:22:39.051+0100warningglassfish3.1.2javax.enterprise.system.core.transaction.com.sun.jts.jta_threadid=2605;_threadname=thread-10;jts5054:完成后出现意外错误

本地异常堆栈:异常[EclipseLink-4002](Eclipse Persistence Services-2.3.2.V20111125-R10461):org.Eclipse.Persistence.exceptions.DatabaseException内部异常:com.mysql.jdbc.exceptions.jdbc4.mysqlintegrityConstraintViolationException:项“primary”的条目“PRJ-00359”重复错误代码:1062调用:INSERT INTO eom(PROJECTNAME)值(?)绑定=>[1个参数绑定]

有两个JMS消息,它们以相同的EOM名称(主键)紧挨着来,线程号2605首先插入EOM。但是还有一个线程的编号是2603,它也在第一次插入之后插入相同的主键。无论如何,第二个线程不知道第一个插入。

现在的问题是,我如何锁定第二个插入等待第一个完成?

暂时还没有答案

 类似资料:
  • 我在JTA和Wildfly8中使用Eclipselink,问题是在提交用户事务并将数据插入数据库后,它不会更新相关实体,所以如果我重新加载页面或打开页面的新实例,它加载数据时不会插入行。

  • 我在PostgreSQL中有一个表,它有许多记录和唯一的键 然后我从Excel导入数据并将其映射到列表。最后,我有一些像 包裹包含大约20,000条记录,并且可以包含违反唯一约束的记录。在这种情况下,我需要跳过该记录并继续插入。 现在我得到了一个预期的错误 微软EntityFrameworkCore。DbUpdateException:更新条目时出错。有关详细信息,请参见内部异常--- 如何忽略它

  • 我有两个实体类Organization和User具有一对多关系(为了简单起见,Groovy代码!): 当我为一个新的组织创建一个新的用户时,一切都运行良好: 但当我使用一个现有的组织,将其设置为新用户的组织属性时,我会得到一个错误: 将导致: org.hibernate.PersistentObjectException:传递给Persist:Organization的分离实体 我知道不能对一个分

  • 我对JPA和ORMs真的很陌生,所以我希望你原谅我的愚蠢问题。我在这个博客和其他网站上读了很多帖子,但建议的解决方案,即使看起来合理,对我来说并不奏效。 我哪里搞错了?多谢帮忙。 编辑:我已添加导入

  • 问题内容: 我正在执行以下几行: 奇怪的情况。如果我仅使用一个实例执行它,则效果很好,但是如果我与多个实例并行执行(一个mdb的实例),则第一个实例将被执行而没有任何异常,其余所有实例都会收到此错误: 知道会导致什么吗?以及它是如何第一次工作的,但是对于所有其他实例却没有? 谢谢, 射线。 问题答案: 该错误消息通常告诉您查询没有返回结果。如此失败。 如果期望空查询结果,请考虑使用并测试结果:

  • 问题内容: 我正在执行插入查询,其中如果已经存在唯一键,则许多列中的大多数都需要更新为新值。它是这样的: 我不确定该子句的语法应该是什么。如何从子句引用当前行? 问题答案: MySQL将假定等号之前的部分引用INSERT INTO子句中命名的列,而第二部分引用SELECT列。