0

我对 JPA persist() 和 merge() 方法有一些问题。

在我的代码中,我愿意。

Foo foo = new Foo("abc");
fooService.persist(foo)
..(blabla)
foo.setField("123");
fooService.merge(foo);

此代码在我的数据库 MySQL 中创建两行 foo。

一次使用 foo (abc, null),另一次使用 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时,它实际上并没有被持久化。尝试更改您的逻辑,以便您最后只调用一次,并且当实体不再更新时(不要使用合并)。

于 2012-09-11T12:55:03.980 回答