2016-08-18 100 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对象,因为你没有提供一个现有的对象,那么你会得到你所看到的重复效果。

相关问题