JPA 2.0 Hibernate 4.1.2 Сущность, не найденная даже для сохранения до этого
У меня есть некоторые проблемы с JPA persist() и метод слияния ().
В моем коде я делаю.
Foo foo = new Foo("abc");
fooService.persist(foo)
..(blabla)
foo.setField("123");
fooService.merge(foo);
Этот код создает две строки Foo в моей базе данных MySQL.
Один раз с foo (abc, null), а другой с foo (abc, 123).
Когда я посмотрел в запросе MySQL, слияние (Foo) не нашел объект Foo в базе данных, поэтому он создает новую строку с обновленными данными. Обратите внимание, что fooService.persist (foo) выполняется в транзакции, а fooService.merge (foo) выполняется в другой транзакции. Я уже вызываю flush () после сохранения, но это не работает.
Пожалуйста, найдите ниже мой код (я не все подробно)
@Entity
public class Foo {
@Id
@GeneratedValue
private Long id;
private String name;
private String field;
public Foo(String name){
this.name = name;
}
}
public class FooServiceImpl {
@Autowired
FooDao fooDao;
@Transactional(Propagation.REQUIRED)
public void persist(Foo foo){
fooDao.persist(foo);
}
@Transactional(Propagation.REQUIRED)
public Foo merge(Foo foo){
return fooDao.merge(foo);
}
}
public class FooDaoImpl {
@PersistenceContext
private EntityManager entityManager;
public void persist(Foo foo){
this.entityManager.persist(foo);
this.entityManager.flush();
}
public Foo merge(Foo foo){
return this.entityManager.merge(foo);
}
}
Есть ли у вас какие-либо идеи? Спасибо
1 ответ
Транзакция фиксируется, когда метод завершается, поэтому, когда вы вызываете persist, в этот момент она фактически не сохраняется. попытайтесь изменить свою логику так, чтобы в конце вызывался только один раз, и когда сущность больше не будет обновляться (не используйте слияние).