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

已分离的JPA实体传递到Persistent

麻茂材
2023-03-14

另外,我有一个IOC托管bean,它内部有一个事务方法。

有2个实体具有单向Many2One--

@Entity
@Table(name = "AU_EVENT")
public class AuEvent { 
    @ManyToOne(fetch= FetchType.LAZY, cascade = {CascadeType.PERSIST, CascadeType.MERGE})
@JoinColumn(name = "MODULE_ID")
private AuModule auModule;
}

AuModule在AUEvents上没有引用

@Async
@Transactional(propagation = Propagation.REQUIRED)
public void onEvent(String moduleName, String instanceName){
        AuModule auModule = auModuleDao.findModule(moduleName, instanceName);
        if (auModule == null) {
            auModule = new AuModule();
            auModule.setInstance(instanceName);
            auModule.setName(moduleName);
        }
//doesnt help
//auModule = auModuleDao.getEntityManager().merge(auModule);

AuEvent auEvent = new AuEvent();
auEvent.setAuModule(auModule);
auEventDao.persist(auEvent); // error here [AuModule detached]
}
@Async
@Transactional(propagation = Propagation.REQUIRED)
public void onEvent(String moduleName, String instanceName){

    AuEvent auEvent = new AuEvent();
    auEventDao.persist(auEvent);

    AuModule auModule = auModuleDao.findModule(moduleName, instanceName);
    if (auModule == null) {
        auModule = new AuModule();
        auModule.setInstance(instanceName);
        auModule.setName(moduleName);
    }
    auEvent.setAuModule(auModule);
    auEventDao.persist(auEvent); // error here [AuEvent detached]
}
public void saveEvent(AuEvent auEvent, String moduleName, String instanceName){
    log.info("saveEvent({}) called...", auEvent);
    AuModule auModule = auModuleDao.findModule(moduleName, instanceName);
    if (auModule == null) {
        auModule = new AuModule();
        auModule.setInstance(instanceName);
        auModule.setName(moduleName);
    }
    auEvent.setAuModule(auModule);
    persist(auEvent);
}

共有1个答案

符功
2023-03-14

在第二个示例中,最后不应调用auEventDAO.persist(auEvent);AUEvent已附加,因此您的事务只需结束即可。
此外,您不应对已全部准备就绪的Persistent对象调用Persist()。您应该只在新对象上调用它。这也是第一个例子中的问题。

您只能在AUEvent上调用persist()一次,没错。但有时存在与此AUEvent相关联的(在DB中已经持久存在的)AUMODULE。并且您用cascadetype.persist标记了此关联。因此persist()也级联到现有的AUModule->异常抛出。

类似这样的操作应该可以:
1。

@Async
@Transactional(propagation = Propagation.REQUIRED)
public void onEvent(String moduleName, String instanceName){
        AuModule auModule = auModuleDao.findModule(moduleName, instanceName);
        if (auModule == null) {
            auModule = new AuModule();
            auModule.setInstance(instanceName);
            auModule.setName(moduleName);
        }
       AuEvent auEvent = new AuEvent();
       auEventDao.persist(auEvent); 

       auEvent.setAuModule(auModule);
       auEventDao.merge(auEvent);
}
@Async
@Transactional(propagation = Propagation.REQUIRED)
public void onEvent(String moduleName, String instanceName){

    AuEvent auEvent = new AuEvent();
    auEventDao.persist(auEvent);

    AuModule auModule = auModuleDao.findModule(moduleName, instanceName);
    if (auModule == null) {
        auModule = new AuModule();
        auModule.setInstance(instanceName);
        auModule.setName(moduleName);
    }
    auEvent.setAuModule(auModule);
    // optioanlly you can call here - auEventDao.merge(auEvent); 
}
 类似资料:
  • 我在尝试使用Spring Data JPA和Hibernate作为JPA提供程序执行批插入操作时遇到了问题。 我有以下方法在我的服务。这就是抛出异常的地方。 Institute是一个实例变量,并提前获取。 我还将实体设置为级联、持久和合并。 为什么这段代码起作用 而此代码不

  • 我在stackoverflow上读了很多关于相同异常的文章,但没有找到任何实际帮助我的东西,所以我在这里:

  • 我有一段很长的JPA+Hibernate代码,它试图在循环中将大量记录插入到DB中。 更奇怪的是,我可以用下面的代码在一次迭代中再现错误。“分离的实体...”第二次刷新时抛出错误。那么这是否意味着第一次同花顺是一个无操作?

  • 我得到了“分离的实体传递到持久”,但我不明白,该对象如何能够处于分离状态。 这里首先是一些上下文。 每个用户和角色有两个: 实体--除了名称之外--有几个不应与此问题相关的字段,外字段角色来自其基类: 在应用程序启动时,我希望确保此ApplicationRunner中存在管理员用户: 应用程序在启动时抛出异常并关闭: 我在这里的理解是,在从存储库中检索到之后就处于分离状态。 为何超脱?我假设方法上

  • JPA和Hibernate的新手,所以请耐心等待,因为我试图绘制一整张图片。所以我有两个具有双向关系的Java对象。员工类是拥有类,部门类是关系的反面。一个部门可以有许多员工,一个员工只能有一个部门。我分配了employee_id作为员工实体的主键,department_id作为部门实体的主键。我还想在员工类中使用department_id作为外键。 员工类 部门类 我用来生成两个对象并将它们保存

  • 我有两个模型,一个用于存储用户详细信息,使用该Id,我试图将用户位置保存在另一个表中,该表使用用户的相同Id作为主键。 为什么我会出现这个错误?坚持是什么意思?我正在使用MySQL数据库(&I)