2012-06-18 2 views
29

나는 사용자 엔티티를 가지고 있으며, id에 의해 그것을 얻으려고한다. 엔티티 정의가 아래에 있습니다. Hibernate : id로 엔티티를 얻는다

package com.hibernate.logic; 

import java.io.Serializable; 
import java.util.Random; 

import javax.persistence.*; 

@Entity 
@Table(name="users") 
public class User implements Serializable { 
    private static final long serialVersionUID = 1L; 

@Id 
@Column(name="user_id") 
private Long userId; 

@Column(name="middlename") 
private String middlename; 

@Column(name="name") 
private String name; 

@Column(name="surname") 
private String surname; 

@Column(name="pass") 
private String pass; 

//bi-directional many-to-one association to Role 
@ManyToOne 
@JoinColumn(name="role_id") 
private Role role; 

public User() { 
    Random random = new Random(); 
    this.userId = random.nextLong(); 
    this.name = ""; 
    this.surname = ""; 
    this.middlename = ""; 
} 

public Long getUserId() { 
    return this.userId; 
} 

public void setUserId(Long userId) { 
    this.userId = userId; 
} 

public String getMiddlename() { 
    return this.middlename; 
} 

public void setMiddlename(String middlename) { 
    this.middlename = middlename; 
} 

public String getName() { 
    return this.name; 
} 

public void setName(String name) { 
    this.name = name; 
} 

public String getSurname() { 
    return this.surname; 
} 

public void setSurname(String surname) { 
    this.surname = surname; 
} 

public Role getRole() { 
    return this.role; 
} 

public void setRole(Role role) { 
    this.role = role; 
} 

public String getPass() { 
    return pass; 
} 

public void setPass(String pass) { 
    this.pass = pass; 
} 

} 

그래서 방법 getUserById (긴 USER_ID는) 그냥 사용자 생성자를 호출 것, 데이터베이스에서 정보를 얻을하지 않습니다. 왜 그래야만하지?

+0

왜 user1을 반환하지 않으시겠습니까? return (User) user1; – Subin

답변

44

사용 get 대신 EntityManager의 EM을 사용하여 load

// ... 
     try { 
      session = HibernateUtil.getSessionFactory().openSession(); 
      user = (User) session.get(User.class, user_id); 
     } catch (Exception e) { 
// ... 
+0

많이 고맙습니다. 하지만 그 차이점을 설명해 주시겠습니까? 왜 cinstructor가 호출 되었습니까? – Anatoly

+1

여기에 세부 사항이 나와 있습니다. http://stackoverflow.com/a/608979/1143825 – Ilya

+0

안녕 Ilya, get (클래스, 매개 변수)에서 매개 변수는 모든 열이 될 수 있습니까? 아니면 기본 키만입니까? –

4

getUserById에는 사용되지 않는 새 개체 (user1)를 만들지 않아야합니다. 이미 할당 된 (그러나 null) user으로 초기화하십시오. 그렇지 않으면 Hibernate.initialize(user); 여기에 실제로 Hibernate.initialize(null);

있는 새로운 getUserById (I이 테스트를하지 않은)이다) :

public User getUserById(Long user_id) { 
    Session session = null; 
    Object user = null; 
    try { 
     session = HibernateUtil.getSessionFactory().openSession(); 
     user = (User)session.load(User.class, user_id); 
     Hibernate.initialize(user); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } finally { 
     if (session != null && session.isOpen()) { 
      session.close(); 
     } 
    } 
    return user; 
} 
+0

죄송합니다, 실제로 맞습니다. 나는 user1과 오인되었습니다. 그러나 그것은 문제를 해결하지 못합니다. 데이터베이스에서 사용자를 얻으려고 할 때 여전히 생성자를 호출합니다. – Anatoly

0

;

public User getUserById(Long id) { 
    return em.getReference(User.class, id); 
} 
관련 문제