2012-09-10 29 views
0

我有JPA persist()和merge()方法的問題。JPA 2.0 Hibernate 4.1.2實體沒有找到,甚至沒有被發現之前

在我的代碼中,我這樣做。

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

你有什麼想法?謝謝

回答

0

當方法結束時提交事務,所以當你調用persist時,它實際上並沒有在那個時刻持續存在。 嘗試改變你的邏輯,這樣你只需要調用一次就可以堅持到底,當實體不再被更新時(不要使用合併)。

相關問題