2013-02-22 2 views
1

Я новичок в JPA, и у меня проблема с этим примером кода из репозитория:JPA как вызвать слияние или сохраняются

@Override 
public boolean add(User user) { 
    EntityManagerFactory emf = HibernateRepositoryFactory 
      .getEntityManagerFactory(); 
    EntityManager em = emf.createEntityManager(); 
    EntityTransaction tx = em.getTransaction(); 
    tx.begin(); 

    User tempUser = null; 
    try { 
     if (user.getId() != null) { 
      tempUser = em.find(User.class, user.getId()); 
     } 
     if (tempUser == null) { 
      em.persist(user); 
     } else { 
      // if so, get the differences and persist them 
      tempUser.setPassword(user.getPassword()); 
      tempUser.setUserName(user.getUserName()); 
      tempUser = em.merge(user); 
     } 
    } catch (Exception e) { 
     logging.error("log error+ " :" + e); 
    } 
    tx.commit(); 
    em.close(); 
    emf.close(); 
    return true; 
} 

с лица:

@Entity 
@Table(name = "USERS") 

public class User implements Serializable { 

private static final long serialVersionUID = 1L; 

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
@Column(name = "ID", nullable = false, unique = true) 
private Long id; 

@Version 
@Column(name = "OPTLOCK") 
private int version; 

@Column(name = "USERNAME", nullable = false) 
private String userName; 

@Column(name = "PASSWORD", nullable = false) 
private String password; 

public User() { 
    super(); 
} 

public String getUserName() { 
    return userName; 
} 

public void setUserName(String userName) { 
    this.userName = userName; 
} 

public String getPassword() { 
    return password; 
} 

public void setPassword(String password) { 
    this.password = password; 
} 

public Long getId() { 
    return id; 
} 

public int getVersion() { 
    return version; 
} 

}

Я не понимаю этого полностью.

В строке: if (user.getId()! = Null) user.getId всегда будет нулевым, потому что я верю, что идентификатор будет сгенерирован в тот момент, когда объект будет сохранен? Подобно этому, tempUser никогда не будет заполнен из db, и объект всегда будет сохраняться и не сливаться ..... Или я вижу это неправильно?

Что будет лучшим способом увидеть, нужно ли вам продолжать или сливаться так.

Редактировать

что, если я буду использовать главным образом:

User user1 = new User(); 

    user1 .setPassword("password_user1"); 
    user1 .setUserName("userName_user1"); 

... .add(user1); 

Если я бегу это один раз, когда добавляется пользователь. Если я снова запустил это, пользователь снова будет сохранен с идентификатором + 1

+0

Идентификатор может быть не нулевым, если он является отдельным объектом, который был изменен. – SJuan76

+0

@ Sjuan76 Насколько я вижу, я не вижу отрыв. Если я создаю основной класс с объектом User, я добавлю этот метод, и я запустил его дважды, тогда 2 пользователя будут в моем db, а не одном .... –

+0

Вы только немного показываете программу. Логика использует код для обновления существующего объекта или сохранения нового. Первое было бы лучше всего сделать, извлекая объект и отсоединив его (так что вы не будете слишком долго ждать сеанса UI). – SJuan76

ответ

1

Вы правы, если пользовательский параметр является новым (никогда не сохранялся), то этот метод будет persist(). Если это отдельный экземпляр (он уже сохранен и имеет идентификатор), он обновит его, вызвав merge().

Я думаю, что имя метода вводит в заблуждение, его следует называть saveOrUpdate().

+0

согласен. Это было бы лучшим именем –

+0

hmmm .. getid() - метод объекта. На данный момент я создаю этот объект, он будет равен нулю. как он может увидеть, если объект уже установлен в db без вызова db. Или я вижу это неправильно –

+0

Если вы установили идентификатор пользователя вручную, и он, как оказалось, является идентификатором существующего пользователя в db, тогда метод будет обновлять существующего пользователя вместо создания нового. За этим нет ничего волшебного, что бы отличить такой объект пользователя, созданный вручную, от того, который является «подлинным» отдельным объектом. – zagyi

0

Если параметр метода User является постоянным объектом, то getId() не будет иметь значение NULL.

+0

, как он получит этот идентификатор? Я называю метод объекта не поиском db? –

+0

Метод добавления должен быть методом класса DAO или Repository. Рассмотрим случай, когда я загрузил объект пользователя в другой сеанс гибернации другим методом, а затем использовал этот объект для вызова этого метода, в то время объект отделяется, а вызов getId() не будет равен нулю. –

+0

Я пробовал это с помощью этой сущности и этого метода. Если я создаю основной метод, который создает новый Пользовательский объект с паролем и именем пользователя, и я использую этот метод для его сохранения. при первом добавлении объекта User, когда я снова запускаю главный, пользователь добавляется снова с id + 1, но все остальные одинаковы? –

Смежные вопросы