2016-08-18 74 views
0

我在J2EE應用程序中的數據庫的基本CRUD操作中遇到問題。爲什麼我的update()方法創建一個新的實例?

實體:

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
@Basic(optional = false) 
@Column(name = "shop_id") 

門面:

public abstract class AbstractFacade<T> { 

private Class<T> entityClass; 

    public void edit(T entity) { 
     getEntityManager().merge(entity); 
    } 
} 

控制器(我加S.out的看個究竟):

public String updateShop(Shop shop){ 
    System.out.println("Update "); 
    System.out.println(this.shop.getName()+" - ID: "+ this.shop.getShopId()); 
    this.shop = shop; 
    return "updateShop"; 
} 

public String updateShop(){ 
    System.out.println("UpdateClick "); 
    System.out.println(this.shop.getName()+" - ID: "+ this.shop.getShopId()); 
    this.shopfacade.edit(this.shop); 
    return "shops"; 
} 

當我點擊更新,一新實例被創建而不是修改現有的實例。這是服務器的日誌輸出:

Info: Update 
Info: Name - 41 
Info: UpdateClick 
Info: ChangedName - null 

因此,該Id以某種方式消失。這發生在我調用updateShop()的那一刻,因爲我在我的JSF頁面上顯示了ID,並且它工作正常。

<h:outputText value="#{shopController.shop.shopId}" title="shopId" /> 

任何想法是怎麼回事?

感謝。

+0

我們需要看到你的JSF的其餘部分知道什麼是綁定到店 – Miles

+0

很好,普通的問題在JSF中,如果你正確因此未綁定的對象。如果您沒有解決問題,請正確發佈JSF代碼和控制器.. –

回答

0

你的一個問題是,javax.persistence.EntityManager.merge返回一個實體對象 - 你的代碼被忽略。

這回實體可能會或可能不會是你在傳遞相同的。通常,如果當前的持久化上下文已經具備了,你在通過,則這將是返回的一個實體的引用。

因此,updateShop()大概應該是這樣的:

public String updateShop(){ 
    System.out.println("UpdateClick "); 
    System.out.println(this.shop.getName()+" - ID: "+ this.shop.getShopId()); 
    this.shop = this.shopfacade.edit(this.shop); 
    return "shops"; 
} 

其次,沒有主鍵傳遞一個實體Bean merge是有效的一樣,它傳遞給persist。因此,如果JSF必須new它自己的Shop對象,因爲你沒有提供一個現有的對象,那麼你會得到你所看到的重複效果。

相關問題