2016-09-21 6 views
0

hibernateとspring-dataを使用するオートパーシストに問題があります。私は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を見ることができます。ただし、メソッドの作成が完了した後、entityA.registeredはfalseに設定されます。

私は "registerExternal()"呼び出しの前に "entityManager.detach(entityA)and entityManager.clear()"を呼び出しようとしましたが、呼び出し後には "entityManager.refresh(entityA)

オートパーシストにしないようにオブジェクトを設定する方法はありますか?

答えて

0

作成メソッドから古いエンティティを戻しています。エンティティのインスタンスを更新し、常に使用する必要があります

この

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

    return updated; 
} 

に変更しようということ。しかしregisterExternalはまた、いくつかのエンティティを更新しています。メソッドの戻りを保存これはこのcreateメソッドの一部であってはなりません。作成は、単一の作成エンティティ(SOLID原則)のみを処理する必要があります。

registerExternal to backgroundスレッド/スケジューラスレッドを削除する方がよい。しかし、あなたがそれを行うことはできませんが(それをする必要があります)、作成する前に最新のエンティティを取得してから

@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()); 
} 
関連する問題