을 유지하는 방법 : 엔티티와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;
}
}
을나는 그것을 완전하게 이해하지 못합니다. 라인에서
: 경우 (user.getId() = 널!) 나는 ID가 개체가 지속됩니다 순간에 생성됩니다 믿기 때문에 user.getId는 항상 null이 될 것인가? 이와 같이 tempUser는 db에서 채워지지 않으며 객체는 항상 지속되고 병합되지 않습니다. 아니면 내가 잘못 본 걸까요?당신이 지속되거나 다음과 같이 병합 할 필요가 있는지 확인하는 가장 좋은 방법이 될 것입니다 무엇.
편집 나는이 같은 주를 사용한다면 어떤
:
I은 사용자가 추가이 한 번 실행하면User user1 = new User();
user1 .setPassword("password_user1");
user1 .setUserName("userName_user1");
... .add(user1);
. 그 다음 다시 실행하면 id + 1로 사용자가 다시 유지됩니다.
이드 널되지 않을 수도있다. – SJuan76
@ Sjuan76 내가보기에는 나는 분리를 보지 못했다. User 객체를 사용하여 메인 클래스를 만들면이 메소드를 추가하고 두 번 실행 한 다음 2 명의 사용자가 db가 아닌 하나의 객체에있게됩니다. –
약간의 프로그램 만 보여줍니다. 논리는 코드를 사용하여 기존 엔티티를 업데이트하거나 새로운 엔티티를 유지합니다. 전자는 엔티티를 검색하고 분리하여 가장 잘 수행 할 수 있습니다 (따라서 UI 대기 시간이 너무 길어 세션을 보유하지 않음). – SJuan76