2012-06-18 15 views
29

Posiadam encję użytkownika i próbuję ją pobrać z bazy za pomocą id. Definicja encji znajduje się poniżej.Hibernacja: pobierz obiekt według identyfikatora

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; 
} 

} 

Więc metoda getUserById (Long user_id) nie otrzymuje informacje z bazy danych, to wystarczy zadzwonić konstruktora użytkownika. Dlaczego tak jest?

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

dlaczego nie powrócisz user1, return (User) user1; – Subin

Odpowiedz

44

użycie get zamiast load

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

thanx dużo, to działa. Ale czy możesz opisać różnicę między nimi? Dlaczego zwano Cinstructor? – Anatoly

+1

Tutaj jest szczegółowo opisana http://stackoverflow.com/a/608979/1143825 – Ilya

+0

Hi Ilya, w get (klasa, parametr), czy parametrem może być dowolna kolumna, czy tylko klucz podstawowy? –

4

W getUserById nie należy utworzyć nowy obiekt (user1), który nie jest używany. Po prostu przypisz ją do już (ale zerowego) zainicjowanego user. Inaczej Hibernate.initialize(user); jest rzeczywiście Hibernate.initialize(null);

Oto nowa getUserById (nie testowałem tego;)):

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

Niestety, masz rację, myliłem się z użytkownikiem1. Ale to nie rozwiązuje problemu. Nadal wywołuje konstruktora, gdy próbuję pobrać użytkownika z bazy danych. – Anatoly

0

Korzystanie EntityManager em;

public User getUserById(Long id) { 
    return em.getReference(User.class, id); 
} 
Powiązane problemy