【问题标题】:How to create new Row's without JPA consider it an update?如何在没有 JPA 的情况下创建新行将其视为更新?
【发布时间】:2016-09-23 14:29:29
【问题描述】:

我现在正在做一个项目,这里有一段代码:

public boolean getAll() {
        TypedQuery<Tag> query = em.createQuery("SELECT c FROM Tag c WHERE (c.tagName !=?1 AND c.tagName !=?2 AND c.tagName !=?3) ", Tag.class);
        query.setParameter(1, "Complete");
        query.setParameter(2, "GroupA");
        query.setParameter(3, "GroupB");

        List<Tag> Tag= query.getResultList();

但是当我尝试做这样的事情时:

Tag.get(2).setTagName = "Hello";
em.persist(Tag.get(2));

它认为它是更新而不是创建?我怎样才能让 JPA 明白它与数据库无关,将链与数据库分离并创建新寄存器,例如仅更改其名称?

非常感谢您的帮助! 最好的问候!

编辑:

在更改其值之前使用em.detach 并保留每个列表都可以正常工作!

谢谢大家!

【问题讨论】:

    标签: java spring-mvc jpa


    【解决方案1】:

    您还没有向我们展示您是如何获取您的列表的,但这里有两个关键点:

    1. 从 EntityManager 读入的所有内容都是托管的 - JPA 检查 这些托管对象进行更改并将它们与 需要时数据库(通过提交事务或 调用冲洗)。

    2. 在托管实体上调用 persist 是无操作的 - 实体是 已经管理,如果它会与数据库同步 还没有。

    所以第一个 Tag.get(2).setTagName = "Hello"; call 是导致您更新的原因,而 persist 是无操作的。

    您需要做的是创建标签对象的新实例并设置字段。在您的对象上创建一个克隆方法,该方法复制除 ID 字段之外的所有内容,然后在结果上调用 persist 以获取新实体的插入。

    【讨论】:

    • 我这样做了,但是当我设置它时,我也犯了同样的错误,在这种情况下,只使用 em.detach 才有所帮助,因为我的 ID 需要在我的情况下更改。很抱歉,如果我不清楚这一点。
    • 我不确定你所说的你“做了”什么导致了同样的错误。如果你坚持一个与现有实体具有相同主键的实体,你只会得到同样的错误——我说过克隆你需要的所有东西,除了 id。将其留空以让提供商分配一个新的,或将其设置为未使用的东西。 Detach 将从上下文中删除实体,但如果您尝试更改 ID 并将其重新关联到持久性上下文,则可能无法正常工作,尤其是当您有其他实体引用它时。
    • 所以,我所做的是创建一个新对象,例如:new Tag,然后可能我犯了一个错误,例如像这样 Tag_ = Tag.get(1) 。但我也尝试复制每个值,例如 Tag_.setAttribute(Tag.get(1).getAttribute())。在 em.detach() 之前,它没有按预期工作。但很明显,这可能是我代码中的任何错误。
    【解决方案2】:

    是否更新或创建新实体对象的决定是基于主键完成的。您可能在每个对象上都使用了一个 ID。更改或删除它,然后坚持。这应该会创建一个新条目。

    如果这不起作用,您可能需要先从实体管理器中分离对象:

    em.detach(tagObj);
    

    然后坚持下去:

    em.persist(tagObj);
    

    您也可以使用强制更新而不是创建

    em.merge(tagObj)
    

    强制创建 AFAIK 没有等效项。 persist 会根据 PK 来做这两件事。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-24
      • 1970-01-01
      • 2013-04-11
      • 1970-01-01
      • 2018-02-19
      • 1970-01-01
      • 2012-06-11
      相关资源
      最近更新 更多