2016-09-21 30 views
0

我在使用hibernate和spring-data的autopersist时遇到了问题。我有以下服务创建entityA。JPA分离实体在退出时仍然存在

@Service 
public class entityAService { 

    private final EntityARepository repository; 

    @PersistenceContext(unitName = "entityManagerFactory") 
    EntityManager entityManager; 

    @Autowired 
    public entityAService(EntityARepository repository) { 
     this.repository = repository; 
    } 

    @Transactional 
    public EntityA create(EntityA entityA) { 
     repository.save(entityA); 

     if (entityA.getRegisterExternal) { 
      registerExternal(); 
     } 

     return entityA; 
    } 

    private void registerExternal() { 
     // we always need the entityA to be registered, however we don't want to not allow entityA creation if 
     // the external register service is down. Thus we need to check for any non registered entityA's and try 
     // to register them again. 
     Set<EntityA> entities = repository.getEntityAWithRegisterExternalAndNotRegistered(); 

     ExternalRegister register = new ExternalRegister(); 
     for (EntityA entity: entities) { 
      try { 
       register.register(entity); 
       entity.setRegistered(true); 
       repository.save(entity); 
      } catch (RegisterException e) { 
       logger.warn("exception", e); 
      } 
     } 

     return; 
    } 
} 

我遇到麻烦的是“entity.setRegistered(true);”为正在创建的实体A.当我通过这个过程时,在“registerExternal();”之后在create方法中,我可以在db中看到最新的entityA.registered = true。但是,在create方法结束之后,entityA.registered会被设置为false。

我曾尝试在“registerExternal()”调用之前调用“entityManager.detach(entityA)和entityManager.clear()以及调用之后的”entityManager.refresh(entityA),但似乎没有任何工作。

有没有办法将对象设置为不autopersist?

回答

0

您正在从创建方法返回旧实体。保存更新实体的实例方法返回,你应该始终使用

尝试改变这种

@Transactional 
public EntityA create(EntityA entityA) { 
    EntityA updated = repository.save(entityA); 
    if (entityA.getRegisterExternal) { 
     registerExternal(); 
    } 

    return updated; 
} 

但registerExternal也更新了一些实体。这不应该是这种创建方法的一部分。创建应该只处理单个创建实体(SOLID原则)。

更好地移除registerExternal到后台线程/调度程序线程。但如果你不能这样做(但你应该这样做),从创建之前取回最新实体

@Transactional 
public EntityA create(EntityA entityA) { 
    EntityA updated = repository.save(entityA); 
    if (entityA.getRegisterExternal) { 
     registerExternal(); 
    } 

    // Fetch latest using ID of EntityA 
    return repository.findOne(entityA.getId()); 
} 
相关问题