2013-02-22 1 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; 
} 

}

나는 그것을 완전하게 이해하지 못합니다. 라인에서

: 경우 (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로 사용자가 다시 유지됩니다.

+0

이드 널되지 않을 수도있다. – SJuan76

+0

@ Sjuan76 내가보기에는 나는 분리를 보지 못했다. User 객체를 사용하여 메인 클래스를 만들면이 메소드를 추가하고 두 번 실행 한 다음 2 명의 사용자가 db가 아닌 하나의 객체에있게됩니다. –

+0

약간의 프로그램 만 보여줍니다. 논리는 코드를 사용하여 기존 엔티티를 업데이트하거나 새로운 엔티티를 유지합니다. 전자는 엔티티를 검색하고 분리하여 가장 잘 수행 할 수 있습니다 (따라서 UI 대기 시간이 너무 길어 세션을 보유하지 않음). – SJuan76

답변

1

사용자 매개 변수가 새로운 (지속 된 적이없는) 경우이 메서드는 persist()이됩니다. 분리 된 인스턴스 (이미 지속되고 ID가있는 경우)에는 merge()을 호출하여 업데이트합니다.

내가 메서드의 이름은 잘못된 생각, 오히려 saveOrUpdate()를 호출해야합니다.

+0

가 동의했습니다. 이것은 더 나은 이름이 될 것입니다. –

+0

hmmm .. getid()는 엔티티의 메소드입니다. 현재이 객체를 만들면 null이됩니다. db에 대한 호출없이 db에 객체가 이미 존재하는지 어떻게 알 수 있습니까? 또는 수동으로 사용자의 ID를 설정하면 나는이 잘못 –

+0

를 참조 수행하고 DB의 기존 사용자의 ID로 발생,이 방법 대신 새로운 하나를 만드는 기존 사용자를 업데이트합니다. 그 뒤에 손으로 만들어진 사용자 객체와 "진짜"분리 된 객체를 구별 할 수있는 불가사의 한 것은 없습니다. – zagyi

0

방법 매개 변수 사용자가 지속 엔티티 다음 getId가 (인 경우) null이되지 않습니다. 이 수정 된 분리 된 개체 인 경우

+0

어떻게이 ID를 얻을 수 있습니까? 엔티티의 메서드를 db에 대한 검색이라고 부르지 않습니까? –

+0

add 메소드는 DAO 또는 Repository 클래스의 메소드 여야합니다. 다른 메소드에서 다른 최대 절전 모드 세션에서 User 엔티티를로드 한 다음이 메소드를 호출하여이 메소드를 호출 한 경우, 오브젝트가 분리되고 getId() 호출이 null이되지 않는 경우를 생각해보십시오. –

+0

이 엔티티와이 메서드로이 작업을 시도했습니다. 암호와 사용자 이름을 사용하여 새 사용자 객체를 만드는 주 메토를 작성하고이 메소드를 사용하여이를 푸시합니다. User 객체가 처음 추가 될 때, 메인을 다시 실행할 때, 사용자는 id + 1로 다시 추가되지만 나머지는 모두 같은가 ?? 메인에 –

관련 문제