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, в этот момент она фактически не сохраняется. попытайтесь изменить свою логику так, чтобы в конце вызывался только один раз, и когда сущность больше не будет обновляться (не используйте слияние).

Другие вопросы по тегам