Hibernate只是第一次插入

时间:2014-02-21 01:40:09

标签: java hibernate jsf

@Entity
public class Human {
    @Id @GeneratedValue(strategy = GenerateType.AUTO)
    int id;
    String name;
}

@ManagedBean
@SessionScoped
public class PessoaFisicaBean {

   Human human = new Human();
   HumanDaoImp dao = new HumanDaoImp();

   public void add() {    
       dao.add(human);      
   }    
}

如果我使用它,它只能在第一次工作,在第二次工作就像合并,但我有坚持:

DaoIMP - >

public void add(Human human) {

   entityManager.getTransaction().begin();
   entityManager.persist(human);
   entityManager.getTransaction().commit();

}

但如果我以这种方式编辑managedbean:

public void add() {    
    dao.add(human);     
    human = new Human();
}

它完美无瑕,但是我永远无法“恢复”最后一个插入,因为在.add之后它为新人清理了人类,我无法理解为什么在持久性中它不会创建另一个id,使用相同=(

Obs:使用PostGreSQL Obs2:JSF + Hibernate

2 个答案:

答案 0 :(得分:0)

在你第一次坚持人类之后,这个人类对象变成了“被管实体”,这意味着ORM识别出这个对象。第二次坚持下去,ORM认为“这不是一个新实体,我们已经知道了”,所以行为就像“合并”。

答案 1 :(得分:0)

我认为你应该改变你喜欢的方法;

@ManagedBean
@SessionScoped
public class PessoaFisicaBean {

   HumanDaoImp dao = new HumanDaoImp();

   public void add() {
       Human human = new Human();//New object
       dao.add(human);      
   } 

   public void edit() {
       Human human = getHuman();//Old object that want to edit
       dao.edit(human);      
   }    

}

在你的DAOImpl

 public void add(Human human) {
      entityManager.getTransaction().begin();
      entityManager.persist(human);
      entityManager.getTransaction().commit();
   }

public void edit(Human human) {
      entityManager.getTransaction().begin();
      entityManager.merge(human);
      entityManager.getTransaction().commit();
   }

所以你不必担心哪个是持久的还是合并的。