JPA分离实体在退出时仍然存在
问题描述:
我在使用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?
答
您正在从创建方法返回旧实体。保存更新实体的实例方法返回,你应该始终使用
尝试改变这种
@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());
}