如何修改列值? (JPA)

时间:2011-04-18 13:17:58

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

我需要使用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;
    }

还有其他替代方法可以修改该行而不先检索它吗?

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

2 个答案:

答案 0 :(得分:2)

以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.
}

答案 1 :(得分:0)

A

em.flush

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

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

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

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

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

em.find(Role.class, id);

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