【问题标题】:Why does my update() method create a new instance?为什么我的 update() 方法会创建一个新实例?
【发布时间】:2016-12-24 20:23:57
【问题描述】:

我的 J2EE 应用程序中的数据库的基本 CRUD 操作存在问题。

实体:

@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" />

知道发生了什么吗?

谢谢。

【问题讨论】:

  • 我们需要查看您的 jsf 的其余部分以了解与该商店绑定的内容
  • 好吧,Jsf 中的常见问题,如果你没有正确绑定 Object。如果您还没有解决问题,请正确发布 JSF 代码和控制器..

标签: jakarta-ee ejb crud enterprise facade


【解决方案1】:

您的一个问题是 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 对象,因为您没有提供现有对象,那么您将获得您所看到的重复效果。

【讨论】:

    猜你喜欢
    • 2021-09-13
    • 1970-01-01
    • 2016-12-20
    • 2011-11-21
    • 1970-01-01
    • 1970-01-01
    • 2018-08-26
    • 1970-01-01
    • 2020-11-27
    相关资源
    最近更新 更多