JPAのpersist()およびmerge()メソッドに問題があります。
私のコードでは、そうします。
Foo foo = new Foo("abc");
fooService.persist(foo)
..(blabla)
foo.setField("123");
fooService.merge(foo);
このコードは、MySQL データベースに 2 つの行 foo を作成します。
1 つは foo (abc, null) で、もう 1 つは foo (abc, 123) です。
mysql クエリを調べたところ、merge(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);
}
}
何か考えはありますか?ありがとう