2014-02-21 110 views
0
@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(); 
} 

它工作完美無瑕,但我將永遠無法「恢復」最後的插入,因爲壓腳提升的。新增乾淨了新的人,我無法理解爲什麼在堅持它不創建另一個ID,使用相同的=(

觀測數據:使用PostgreSQL OBS2:JSF + Hibernate的

回答

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(); 
    } 

所以你不必擔心這是持續存在或合併。

0

後當你第一次堅持人類時,這個人類對象就變成了「管理實體」,這意味着ORM識別了這個對象。第二次堅持它時,ORM認爲「這不是一個新的實體,我們已經知道它」,所以行爲就像「合併」。

+0

我怎樣才能改變它,我每次點擊保存,它插入一個新的? – user3284660

+0

我想我會解決它只是添加一個人類=新的人類();;我不知道如何解決沒有它 – user3284660

+0

是的,這是正常的方式。另一種方法是使用[entityManager.detach](http://docs.oracle.com/javaee/6/api/javax/persistence/EntityManager.html#detach(java.lang.Object)) – Stoneboy