JPA 2.0 Hibernate 4.1.2实体以前甚至没有被持久化

JPA 2.0 Hibernate 4.1.2实体以前甚至没有被持久化,hibernate,jpa,merge,jpa-2.0,persist,Hibernate,Jpa,Merge,Jpa 2.0,Persist,我对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,

我对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)在另一个事务中执行。我已经在persist之后调用了flush(),但它不起作用

请在下面找到我的代码(我不详细说明)


你知道吗?谢谢,

当方法完成时,事务被提交,所以当您调用persist时,此时它实际上并没有被持久化。 尝试更改您的逻辑,以便在最后只调用一次persist,并且当实体不再更新时(不要使用merge)

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