使用@Transactional注释时,如何在事务完成之前检索新持久实体的id。?
假设我有一个User表,其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,将其添加到审计对象然后保留它..但问题是用户对象不是' t真的持久化,因此添加到审计对象的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。
答案 0 :(得分:1)
我认为你想要session.save(用户)或session.saveOrUpdate(用户)。根据JavaDocs:
merge(String entityName,Object object) - 将给定对象的状态复制到具有相同标识符的持久对象上。
save(Object object) - 保留给定的瞬态实例,首先分配生成的标识符
我认为merge需要一个已经持久化的实体,这就是merge()/ flush()没有给你一个的原因。但是,Save()/ flush()应该是。