0

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);
  }
}

何か考えはありますか?ありがとう

4

1 に答える 1

0

メソッドが終了するとトランザクションがコミットされるため、persistを呼び出すと、その時点では実際には永続化されません。ロジックを変更して、最後に1回だけ呼び出すようにし、エンティティが更新されなくなるようにします(マージは使用しないでください)。

于 2012-09-11T12:55:03.980 に答える