@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
答案 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();
}
所以你不必担心哪个是持久的还是合并的。