У меня есть DAO с аннотацией @Transactional
и с EntityManager
внутри.Отсоединенный объект JPA для сохранения
Кроме того, у меня есть некоторый управляемый 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]
}
Как я прочитал в https://stackoverflow.com/questions/14057333/detached-entity-passed-to-persist-error-with-onetomany-relation Я попытался сделать так
@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]
}
ТАК, кто-нибудь знает, как я могу избежать этого? PS Пожалуйста, не предложить мне написать метод DAO, как что -
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);
}
Я точно хочу, чтобы сохранить событие & модуль не внутри любого DAO
Благодарности
Спасибо, что помогли мне! Но единственное различие, которое я вижу между 1 и 2, - это вызов DAO.merge() ... Я не могу поверить, что если бы я не назвал merge (2-й вариант), auModule будет сохранен в DB ... – Olegdelone
Он должен работать, объект auEvent * прикреплен * см. - http://stackoverflow.com/questions/1069992/jpa-entitymanager-why-use-persist-over-merge. Я предпочел бы первый вариант, явно вызывающий слияние. –
Невероятно! Так работает первый вариант! Ты крут. – Olegdelone