代码之家  ›  专栏  ›  技术社区  ›  Allan

更新JPA实体中的一个字段

jpa
  •  10
  • Allan  · 技术社区  · 15 年前

    我有一个实体 User 在一个函数中分配了一个系统特权。我有一个网页,您可以从下拉列表中选择一个用户,然后将表单提交给服务器。在服务器端,我只想更新该实体的一个字段。

    我的用户实体将拥有所有对象的默认值,但得到设置的字段及其ID除外。是否需要执行 findById 然后更新特定字段,然后进行合并,或者是否有方法告诉只更新该字段?

    3 回复  |  直到 8 年前
        1
  •  9
  •   Pascal Thivent    15 年前

    是否需要执行findbyid,然后更新特定字段,然后进行合并

    这将是常规方法,除了不需要合并托管实体之外,只需让JPA检测更改并自动更新即可。

    或者是否有方法告诉只更新该字段?

    不,但是你可以用你的 User (只更新字段)。另一种选择是使用 批量更新操作 但这确实不是一个好的用例。我不会用这种方法。

    参考文献

    • JPA 1.0规范
      • 4.10批量更新和删除操作
        2
  •  8
  •   Pau Kiat Wee    11 年前

    JPA2.1现在支持更新条件,允许您通过 javax.persistence.criteria.CriteriaUpdate<T> .

    贾瓦多克 here .

    示例代码:

    EntityManagerFactory factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
    EntityManager em = factory.createEntityManager();
    
    // create user
    em.getTransaction().begin();
    User user = new User();
    user.setUsername("user@example.com");
    user.setPassword("password");
    user.setCreatedAt(new Date());
    em.persist(user);
    em.getTransaction().commit();
    // end create user
    
    assert user.getId() != 0;
    
    System.out.println("Before update user Date of Birth: " + user.getDateOfBirth());
    
    // update user date of birth
    em.getTransaction().begin();
    CriteriaBuilder cb = em.getCriteriaBuilder();
    CriteriaUpdate<User> updateCriteria = cb.createCriteriaUpdate(User.class);
    Root<User> root = updateCriteria.from(User.class);
    // update dateOfBirth property
    updateCriteria.set(root.get("dateOfBirth"), new Date());
    // set where clause
    updateCriteria.where(cb.equal(root.get("id"), user.getId()));
    // update
    int affected = em.createQuery(updateCriteria).executeUpdate();
    System.out.println("Affected row: " + affected);
    em.getTransaction().commit();
    // end update user date of birth
    
    
    // select user again to verify
    em.getTransaction().begin();
    em.refresh(user);
    
    System.out.println("After update User Date of Birth: " + user.getDateOfBirth());
    
    em.getTransaction().commit();
    em.close();
    

    更多细节 JPA 2.1 partial update here .

        3
  •  0
  •   Armand    10 年前

    如果要更新由客户机选择的实体,则有两个选项。

    1)如果所选用户在客户机中表示为一个独立的实体,那么当您在服务器bean中接收到用户实体时,您只需要分配新的字段值,然后执行em.merge(selected user)。如果用户的状态在执行更新的服务器的用户选择之间发生了变化,则会产生负面影响,从而导致不希望的结果。

    2)只需让表单提交用户ID,然后使用findbyid查找用户,修改实体,然后提交更改。如果这是服务器管理的持久性单元,则不需要提交。

    推荐文章