2014-12-04 192 views
1

我有OneToMany關係的問題。 我正在使用彈簧mvc和彈簧安全和休眠4.Hibernate - @OneToMany - com.sun.jdi.InvocationException發生調用方法

我使用所有的註釋。

我的問題是在實體戰爭時,我看到atributte名單的球員調試,我看到players= PersistentBag,當我點擊它com.sun.jdi.InvocationException occurred invoking method.

而且我得到這個異常:

org.apache.jasper.JasperException: org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: clanwar.model.War.players, could not initialize proxy - no Session 

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: clanwar.model.War.players, could not initialize proxy - no Session 

實體:

@Entity 
@Table(name = "WARS") 
public class War implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "ID", nullable = false) 
    private int id; 

    @ManyToOne 
    @JoinColumn(name = "CLAN") 
    private Clan clan; 

    @Column(name = "START_DATE") 
    private Date startDate; 

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

    @OneToMany(mappedBy = "war") 
    private List<WarPlayer> players; 

    @Transient 
    private List<Enemy> enemies; 

    public War() { } 

    // Getters and setters. 

} 

-

@Entity 
@Table(name = "WAR_PLAYERS") 
public class WarPlayer implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @Id 
    @ManyToOne 
    @JoinColumn(name = "WAR") 
    private War war; 

    @Id 
    @ManyToOne 
    @JoinColumn(name = "PLAYER") 
    private Player player; 

    @Column(name = "WAR_NUMBER") 
    private int warNumber; 

    @ManyToOne 
    @JoinColumn(name = "OBJETIVE_1") 
    private Attack objetive1; 

    @ManyToOne 
    @JoinColumn(name = "OBJETIVE_2") 
    private Attack objetive2; 

    @ManyToOne 
    @JoinColumn(name = "RECOMMENDED_1") 
    private Attack recommended1; 

    @ManyToOne 
    @JoinColumn(name = "RECOMMENDED_2") 
    private Attack recommended2; 

    @ManyToOne 
    @JoinColumn(name = "FINAL_1") 
    private Attack final1; 

    @ManyToOne 
    @JoinColumn(name = "FINAL_2") 
    private Attack final2; 
    private String comment; 

    public WarPlayer() {} 

    // Getters and setters 

} 

吾道

@Override 
    public War findById(int id) throws DaoException { 

     War war; 

     try { 
      war = (War) getSession() 
        .createQuery("from War where ID = :id") 
        .setParameter("id", id) 
        .uniqueResult(); 
     } catch (Exception e) { 
      throw new DaoException(e.getMessage()); 
     } 

     return war; 
    } 

回答

13

Hibernate文檔說:

在正常情況下,訂單協會會偷懶的 休眠

所以加載,你需要使用躍躍欲試取指:

@OneToMany(mappedBy = "war",fetch = FetchType.EAGER) 
private List<WarPlayer> players; 
+0

非常感謝,我失去了幾個小時與此有關。謝謝。 – Arturo 2014-12-04 09:09:42

+0

@ stel,不客氣 – 2014-12-04 09:10:49

0

更換吾道

@Override 
public War findById(int id) throws DaoException { 

    Transaction transaction = null; 
    Session session = null; 

    try { 
     session = sessionFactory.openSession(); 
     session.setFlushMode(FlushMode.COMMIT); 
     transaction = session.beginTransaction(); 

     String hql = "from War where ID = :id"; 
     Query query = session.createQuery(hql); 

       query.setParameter("id", id).uniqueResult(); 

    } catch (Exception e) { 
     throw new DaoException(e.getMessage()); 
    } 

    return war; 
} 
+0

謝謝,但我忘了說我有@Transactional註釋。有了這個,我得到了同樣的錯誤。我的問題與Tkachuk_Evgen aswer解決 – Arturo 2014-12-04 09:11:43

1

FetchType.EAGER效率不高。您必須包含org.hibernate.annotations.Fetch註釋。

所以:

@Fetch(FetchMode.JOIN) 
@OneToMany(mappedBy = "war", targetEntity = WarPlayer.class) 
private List<WarPlayer> players; 
相關問題