Я новичок в 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
Идентификатор может быть не нулевым, если он является отдельным объектом, который был изменен. – SJuan76
@ Sjuan76 Насколько я вижу, я не вижу отрыв. Если я создаю основной класс с объектом User, я добавлю этот метод, и я запустил его дважды, тогда 2 пользователя будут в моем db, а не одном .... –
Вы только немного показываете программу. Логика использует код для обновления существующего объекта или сохранения нового. Первое было бы лучше всего сделать, извлекая объект и отсоединив его (так что вы не будете слишком долго ждать сеанса UI). – SJuan76