Как реализовать метод update () в DAO, используя EntityManager (JPA)? - PullRequest
20 голосов
/ 27 ноября 2009

Каков стандартный способ реализации простого обновления?

Пример: у нас есть Пользователь с номером телефона NNNNNN, и теперь мы хотим установить для него ГГГГГГ.

@PersistenceContext
private EntityManager em;

public void update (User transientUser) {
    what should be here?
}

Сущность пользователя максимально проста:

@Entity
@Table (name = "USER")
public class User {

    @Id
    @GeneratedValue
    private Integer id;

    @Column (nullable = false, unique = true)
    private String login;
    private String phone;

    public User () { }

    ... //some setters and getters
}

Ответы [ 2 ]

45 голосов
/ 27 ноября 2009

В соответствии со спецификациями JPA, EntityManager#merge() вернет ссылку на другой объект , чем тот, который был передан, когда объект уже был загружен в текущем контексте. Итак, я бы лучше возвратил результат merge() и написал бы метод update() следующим образом:

@PersistenceContext
private EntityManager em;

public User update (User transientUser) {
    return em.merge(transientUser);
}

Затем используйте это следующим образом (пропуская часть инициализации):

user.setPhone("YYYYYY");
user = dao.update(user);
2 голосов
/ 27 ноября 2009

измените свойство и затем используйте EntityManager merge ()

http://java.sun.com/javaee/5/docs/api/javax/persistence/EntityManager.html#merge%28T%29

...