Как изменить значение столбца? (JPA), - PullRequest
0 голосов
/ 18 апреля 2011

Мне нужно изменить значение столбца, используя синтаксис запроса 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 ]

2 голосов
/ 18 апреля 2011

Использовать 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.
}
0 голосов
/ 18 апреля 2011

A

em.flush

после

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

должно быть достаточно. Насколько я помню, до тех пор, пока EntityManager управляет компонентом (как здесь), все изменения автоматически отражаются.

Если это не сработает, возможно, попробуйте

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

редактирование: Кстати, для поиска роли вы также можете написать

em.find(Role.class, id);

если вы правильно сопоставили идентификатор в классе Role.

...