2012-06-27 60 views
0

我有一種情況,當我希望它在一對多時沒有發生延遲加載。很顯然,我對此很陌生。當我調用s.getSongComposers()時,爲什麼SongComposers不會被抓取?不完全理解延遲加載

這裏是我的DAO類:

public class SongDAOImpl implements SongDAO { 

    @PersistenceContext 
    private EntityManager em; 

    @Override 
    @SuppressWarnings(value = { "unchecked" }) 
    public List<Song> getAllSongsOnAlbum(int albumID) { 
     Query q = em.createQuery("SELECT s FROM Song s WHERE s.album.albumID = :albumid ORDER BY s.songName"); 
     q.setParameter("albumid", albumID); 
     List<Song> list = (List<Song>) q.getResultList(); 
     for (Song s: list) { 
      s.getSongComposers(); 
     } 
     return list; 
    } 

} 

這裏是我的歌實體:

@Entity 
@Table(name="songs") 
public class Song { 

    @Id 
    @GeneratedValue 
    @Column(name="SongID") 
    private int songID; 

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

    @Column(name="Length") 
    private int length; 

    @ManyToOne 
    @JoinColumn(name="AlbumID", referencedColumnName="AlbumID") 
    private Album album; 

    @OneToMany(mappedBy="song") 
    private List<SongComposer> songComposers; 


     .... all getters/setters ...... 
     } 

這裏是我的SongComposer實體:

@Entity 
@Table(name="song_composer") 
public class SongComposer { 


    @Id 
    @GeneratedValue 
    @Column(name="SongComposerID") 
    private int songComposerID; 


    @ManyToOne 
    @JoinColumn(name="SongID", referencedColumnName="SongID") 
    private Song song; 


    @ManyToOne 
    @JoinColumn(name="ComposerID", referencedColumnName="ComposerID") 
    private Composer composer; 


     ..... getters/setters ....... 

} 

回答

1

你必須明確地做到這一點。試試這個查詢:

SELECT DISTINCT s FROM Song s JOIN FETCH s.songComposers WHERE s.album.albumID = :albumid ORDER BY s.songName" 
+0

非常感謝!我不得不在那裏打一個DISTINCT。這似乎是與Hibernate不同的行爲,我認爲它會自動地調用getter來引入子記錄。 – badgerduke