2012-06-18 31 views
29

Tôi có thực thể người dùng và cố gắng lấy nó từ cơ sở theo id. Định nghĩa đối tượng bên dưới.Hibernate: nhận thực thể theo 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; 
} 

} 

Vì vậy, phương thức getUserById (Long user_id) không nhận được thông tin từ cơ sở dữ liệu, nó chỉ gọi hàm tạo người dùng. Tại sao nó như vậy?

public User getUserById(Long user_id) { 
     Session session = null; 
     User user = null; 
     try { 
      session = HibernateUtil.getSessionFactory().openSession(); 
      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

tại sao bạn không trả lại người dùng1, trả lại (Người dùng) user1; – Subin

Trả lời

44

sử dụng get thay vì load

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

thanx rất nhiều, nó hoạt động. Nhưng bạn có thể mô tả sự khác biệt giữa chúng? Tại sao cinstructor lại được gọi? – Anatoly

+1

Ở đây nó được chi tiết chi tiết http://stackoverflow.com/a/608979/1143825 – Ilya

+0

Hi Ilya, trong get (lớp, tham số), tham số có thể là bất kỳ cột nào không, hoặc nó chỉ dành cho khóa chính? –

4

Bạn không nên tạo đối tượng mới (user1) không được sử dụng. Chỉ cần gán nó cho đã được khởi tạo (nhưng null) đã được khởi tạo user. Nếu không Hibernate.initialize(user); thực sự là Hibernate.initialize(null);

Đây là mới getUserById (Tôi đã không kiểm tra này;)):

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

Xin lỗi, bạn thực sự đúng, tôi đã nhầm lẫn với user1. Nhưng nó không giải quyết được vấn đề. Nó vẫn gọi hàm khởi tạo khi tôi đang cố gắng lấy người dùng từ cơ sở dữ liệu. – Anatoly

0

Sử dụng EntityManager em;

public User getUserById(Long id) { 
    return em.getReference(User.class, id); 
} 
Các vấn đề liên quan