在使用@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。
但所有這兩種方法不會返回任何東西。如果我使用這兩種方法中的任何一種,我如何獲得新持續實體的Id? – RKodakandla
save()在我的情況下似乎也不起作用,因爲id是由數據庫序列生成的。並且在事務實際提交之前不會生成該序列 – RKodakandla
您不需要提交事務以從數據庫獲取生成的序列標識符。 (如果你處於一個事務塊的中間並執行save(),數據庫序列就會生成標識符,如果你提交了,INSERT就會被提交,並且對序列進行更改,如果你回滾,那麼INSERT是隨着序列的改變一起回滾。) – BobG