2015-04-30 88 views
0

我有一個「用戶」類:許多一對多關係檢索數據 - 休眠

public class User implements Serializable { 
@Id 
@GeneratedValue 
int id; 

String nome; 

@Column(unique = true) 
String email; 

@ManyToMany 
@JoinTable (name = "user_roles", joinColumns= 
    { @JoinColumn (name = "user_id")}, inverseJoinColumns= 
    { @JoinColumn (name = "role_id")}) 
private List<Role> roles; 

我有一個「角色」類:

public class Role implements Serializable { 

private static final long serialVersionUID = 1L; 

@Id 
@GeneratedValue 
int id; 

@Column(unique = true) 
String role; 

關係:一個用戶有角色,角色有用戶。我在這裏有一個多對多的關係。關係是單向的,我的主要實體是用戶。

在我的數據庫中有一個名爲「user_roles」的表,自動創建。我有一個用戶註冊了兩個角色。

當我使用「UserDao」類從我的數據庫中檢索用戶,並嘗試訪問用戶的角色時,我得到NullPointerException。我獲得了所有其他信息(姓名,電子郵件等),但我無法訪問的角色。

我 'userDAO的' 類:

public class UserDaoImpl implements UserDao{ 

private static final transient Logger log = LoggerFactory.getLogger(UserDaoImpl.class); 
private final String HIBERNATE_CFG = "data.cfg.xml"; 
    @Override 
    public int insertUser (User user){ 
    int code = 0; 

    Session session = new HibernateUtil(HIBERNATE_CFG).getSessionFactory().getCurrentSession(); 
    try { 
     session.beginTransaction(); 
     session.save(user); 
     session.getTransaction().commit(); 
     code = 1; 
    } 
    catch (Exception e) { 
     log.error(e.getMessage()); 
     session.getTransaction().rollback(); 
     code = 0; 
    } 

    return code; 
} 

@Override 
public List<User> getAll() { 
    Session session = new HibernateUtil(HIBERNATE_CFG).getSessionFactory().getCurrentSession(); 
    List<User> users = null; 

    try 
    { 
     session.beginTransaction(); 
     String queryString = "SELECT * FROM USER;"; 
     SQLQuery consulta = session.createSQLQuery(queryString); 
     consulta.setResultTransformer(Transformers.aliasToBean(User.class)); 
     users = (List<User>) consulta.list(); 
     session.getTransaction().commit(); 

    } 
    catch(ConstraintViolationException e) 
    { 
     log.error(e.getMessage()); 
     session.getTransaction().rollback(); 
    } 
    return users; 
} 

我試着用iterator:

List roles = user.getRegras(); 
    for (Iterator it = roles.iterator(); it.hasNext();){ 
     Role r = (Role) it.next(); 
     out.println("Role:" + r.getRole()); 
    } 

我試圖實例變量 「角色」 中的 '用戶' 類像下面。但每一次的變量返回size 0:

@ManyToMany 
@JoinTable (name = "user_roles", joinColumns= 
{ @JoinColumn (name = "user_id")}, inverseJoinColumns= 
{ @JoinColumn (name = "role_id")}) 
private List<Role> regras = new ArrayList<Role>(); 

我試圖從對象的用戶獲得的角色,但我得到一個NullPointerException異常時的方法大小()被調用。

List<Role> roles = (List<Role>)user.getRoles(); 
out.println("size roles: " + roles.size()); 

我想接取我的表「user_roles」從數據庫中檢索數據,但我不能dothis。誰能幫我?

由於提前

+0

你的映射看起來OK。打開SQL日誌記錄以查看生成的查詢。然後,直接在數據庫上運行查詢以檢查它是否返回任何結果。 –

+0

你可以發佈UserDAO類的代碼嗎? –

+1

@PredragMaric他的Hibernate代碼充滿了問題。除非您確定確實沒有問題,否則請不要發佈一切正常。 –

回答

0

您使用一個SQL查詢來加載用戶,結果到實體映射。所以你得到的是分離的實體,只包含SQL查詢返回的內容。

學習使用JPQL/HQL,並加載實體,然後將管理:

String queryString = "SELECT u FROM User u"; 
    Query consulta = session.createQuery(queryString); 
    users = (List<User>) consulta.list(); 
+0

當我使用HQL獲取列表時,我得到以下例外: 未能延遲初始化角色集合:User.roles,無法初始化代理 - 否會話 – Guilherme

+0

Google例外,並理解它的意義以及如何避免它。關於這個例外已經有幾十個問題了。 –

+0

完美的作品JBNizet。謝謝! +1 – Guilherme