Spring-HIbernate:实体持久化之前的实体id

时间:2011-11-02 23:16:37

标签: hibernate spring-mvc

使用@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。

1 个答案:

答案 0 :(得分:1)

我认为你想要session.save(用户)或session.saveOrUpdate(用户)。根据JavaDocs:

  

merge(String entityName,Object object) - 将给定对象的状态复制到具有相同标识符的持久对象上。

     

save(Object object) - 保留给定的瞬态实例,首先分配生成的标识符

我认为merge需要一个已经持久化的实体,这就是merge()/ flush()没有给你一个的原因。但是,Save()/ flush()应该是。