2011-11-02 56 views
1

在使用@Transactional註釋時,如何在事務完成之前檢索新持久化實體的標識。Spring-HIbernate:實體持久化之前的實體標識

可以說,我有一個用戶表,它是由數據庫序列生成的ID ..

User.java

@Entity 
public class User { 
    @Id 
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="USERSEQ") 
    @SequenceGenerator(name="USERSEQ", sequenceName = "USERSEQ") 
    @Column(name="ID", nullable=false) 
    private int id; 

    @Column(name="FIRSTNAME", nullable=false) 
    private String firstName; 

    @Column(name="LASTNAME", nullable=false) 
    private String lastName; 
    } 

我想要做這樣的事情在服務類..堅持的用戶對象,然後獲取該實體的ID,將其添加到審計對象,然後堅持它..但問題是,用戶對象並沒有真正持久,因此添加到審計對象的ID不是真正的ID新的用戶記錄。

UserService.java

@Transactional 
    public void addUser(User newUser, UserAudit userAudit){ 
     newUser = userDao.addUser(newUser); 
     userAudit.setUserId(newUser.getId()); 
     userAuditDao.addUserAudit(userAudit); 
    } 

我試圖從DAO層返回用戶對象之前沖洗會話,但它似乎沒有工作...

UserDao.java

public User addUser(User user){ 
    Session session = sessionFactory.getCurrentSession(); 
    user = (User) session.merge(user); 
     session.flush(); 
    return user; 
    } 

那麼在交易完成之前,我需要在這裏獲取服務層中的id? TIA。

回答

1

我想你想要session.save(用戶)或session.saveOrUpdate(用戶)。根據JavaDocs:

merge(String entityName,Object object) - 將給定對象的狀態複製到具有相同標識符的持久對象上。

節省(Object對象) - 堅持給定的瞬態的實例中,首先分配一個生成的標識符

我認爲merge需要一個已經持續存在實體,這就是爲什麼合併()/沖洗()不是給你一個。然而,保存()/ flush()應該。

+0

但所有這兩種方法不會返回任何東西。如果我使用這兩種方法中的任何一種,我如何獲得新持續實體的Id? – RKodakandla

+0

save()在我的情況下似乎也不起作用,因爲id是由數據庫序列生成的。並且在事務實際提交之前不會生成該序列 – RKodakandla

+0

您不需要提交事務以從數據庫獲取生成的序列標識符。 (如果你處於一個事務塊的中間並執行save(),數據庫序列就會生成標識符,如果你提交了,INSERT就會被提交,並且對序列進行更改,如果你回滾,那麼INSERT是隨着序列的改變一起回滾。) – BobG