【问题标题】:How to modify column value? (JPA)如何修改列值? (JPA)
【发布时间】:2011-04-18 13:17:57
【问题描述】:

我需要使用 JPA 查询语法 (JPQL) 更改列的值,我该怎么做?

这就是我检索要更新的行的方式:

@PersistenceContext
    private EntityManager em;

    public Role activateUser(long id) {
        Query query = em
                .createQuery("SELECT r.id FROM Role r WHERE r.id=" + id);
        Role tmpRole = (Role) query.getSingleResult();
        tmpRole.setAccountStatus(AccountStattus.ACTIVATED.toString());
        //How can i create query to save the changes here?)
        return tmpRole;
    }

是否有任何其他替代方法可以修改该行而不先检索它?

从性能的角度来看,您认为最好的方法是什么?

【问题讨论】:

    标签: java sql jpa jakarta-ee java-ee-6


    【解决方案1】:

    以JPA方式使用JPA:

    1) 加载实体,然后将其附加到当前事务。 2) 改变实体 3) 提交事务

    事务处理可以通过例如@Transactional 来完成,但Java EE 5/6 有许多其他方法可以做到这一点。

    @PersistenceContext
    private EntityManager em;
    
    //@Transactional - Not Java EE, anyway I keep it as notice that the method is invoked in a transaction.
    public Role activateUser(long id) {
        Role role = em.find(Role.class, id);        
        role.setAccountStatus(AccountStattus.ACTIVATED.toString());
        //Thats all.
    }
    

    【讨论】:

    • 该代码在 EJB 中,我需要事务注释吗?
    • 不,EJB 默认打开一个事务。 (我知道 JEE6 和猜测 JEE5 相同)
    • 我是这么认为的。我正在尝试您的代码,但我无法修改该值,也许它与我的代码中的其他内容有关,我会检查。 (1+)
    • @sfrj:检查您的事务是否不是只读的。 -- 这是我个人的典型错误。
    • 如何检查?我不太明白(我不使用事务注释)
    【解决方案2】:

    一个

    em.flush
    

    之后

    tmpRole.setAccountStatus(AccountStattus.ACTIVATED.toString());
    

    应该够了。我记得,只要一个 bean 由 EntityManager 管理(这里就是这种情况),所有更改都会自动反映。

    如果这不起作用,那么也许可以尝试

    tmpRole.setAccountStatus(AccountStattus.ACTIVATED.toString());
    em.merge(tmpRole);
    

    编辑: 顺便说一句,为了找到你也可以写的角色

    em.find(Role.class, id);
    

    如果您正确映射了 Role 类中的 ID。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-06
      • 1970-01-01
      • 2021-01-04
      • 1970-01-01
      • 1970-01-01
      • 2012-11-07
      • 1970-01-01
      相关资源
      最近更新 更多