2015-11-19 99 views
2

我需要你的幫助。我試圖從數據庫中使用Hibernate獲取對象列表,但對我來說似乎很奇怪。Spring/Hibernate獲取包含列表的對象列表[已解決]

在數據庫中,我有5個運行,每個運行3個位置。

當我從RunDao獲取運行列表時,我獲得了15個運行對象的列表!三次首次運行具有相同的ID。

在我的情況下,我只想得到5次運行。難道我做錯了什麼 ?

如何獲得5次運行?

非常感謝

這裏是我的班運行/位置/ RunDao:

Run.java

@Entity 
@Table(name="kr_runs") 
public class Run { 

    private long id; 
    private Date date; 
    private int indexedPages; 
    private int pr; 
    @JsonIgnore 
    private Site site; 
    private Set<Position> positions = new HashSet<Position>(0); 

    public Run() { 

    } 

    @Id 
    @GeneratedValue 
    @Column(name="id") 
    public long getId() { 
     return id; 
    } 

    public void setId(long id) { 
     this.id = id; 
    } 

    @Temporal(value=TemporalType.TIMESTAMP) 
    public Date getDate() { 
     return date; 
    } 

    public void setDate(Date date) { 
     this.date = date; 
    } 

    @Column(name="indexed_pages") 
    public int getIndexedPages() { 
     return indexedPages; 
    } 

    public void setIndexedPages(int indexedPages) { 
     this.indexedPages = indexedPages; 
    } 

    @Column 
    public int getPr() { 
     return pr; 
    } 

    public void setPr(int pr) { 
     this.pr = pr; 
    } 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "kr_site_id", nullable = false) 
    public Site getSite() { 
     return site; 
    } 

    public void setSite(Site site) { 
     this.site = site; 
    } 

    @Cascade({CascadeType.ALL}) 
    @OneToMany(fetch = FetchType.EAGER, mappedBy = "run") 
    public Set<Position> getPositions() { 
     return positions; 
    } 

    public void setPositions(Set<Position> positions) { 
     this.positions = positions; 
    } 



} 

Position.java

@Entity 
@Table(name="kr_positions") 
public class Position { 

    private long id; 
    private int pos; 
    private String url; 
    @JsonIgnore 
    private Run run; 
    private Keyword keyword; 

    public Position() { 

    } 

    @Id 
    @GeneratedValue 
    @Column(name="id") 
    public long getId() { 
     return id; 
    } 

    public void setId(long id) { 
     this.id = id; 
    } 

    @Column 
    public int getPos() { 
     return pos; 
    } 

    public void setPos(int pos) { 
     this.pos = pos; 
    } 

    @Column 
    public String getUrl() { 
     return url; 
    } 

    public void setUrl(String url) { 
     this.url = url; 
    } 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "kr_run_id", nullable = false) 
    public Run getRun() { 
     return run; 
    } 

    public void setRun(Run run) { 
     this.run = run; 
    } 

    //@Cascade({CascadeType.SAVE_UPDATE}) 
    //@OneToOne(mappedBy="position") 
    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "kr_keyword_id", nullable = false) 
    public Keyword getKeyword() { 
     return keyword; 
    } 

    public void setKeyword(Keyword keyword) { 
     this.keyword = keyword; 
    } 



} 

RunDao.java

@Transactional 
public class RunDao extends HibernateDao<Run, Long> implements IRunDao { 

    public List<Run> find(long siteID, Date date_start, Date date_end) { 

     Criteria cr = currentSession().createCriteria(Run.class); 
     cr.add(Restrictions.eq("site.id", siteID)); 
     cr.add(Restrictions.ge("date",date_start)); 
     cr.add(Restrictions.lt("date",date_end)); 

     List<Run> list = (List<Run>) cr.list(); 

     if (list.isEmpty()) return null; 
     else return list; 
    } 

} 

感謝Guillaume的幫助,我找到了解決方案。

  • 我取代在運行類:

@OneToMany(取= FetchType.EAGER,的mappedBy = 「跑」)

通過

@OneToMany(取= FetchType。 LAZY,mappedBy =「run」)

  • 在我的RunsService類中,當我從DAO中獲得運行時,我拉動了懶惰收藏:
// Get data from DAO 
List<Run> list = runDao.find(siteID, cal.getTime(), date_today); 
for(Run run : list) 
{ 
    Hibernate.initialize(run.getPositions()); // run.getPositions().size(); if you are note in @Transactional 
} 

回答

2

代碼中的一切看起來都正確。我不太確定@OneToMany(fetch = FetchType.EAGER ...,因爲我以前有EAGER獲取類型的錯誤。

嘗試讓它懶惰,並在您的標準查詢中添加fetch join

+1

感謝Guillaume的幫助。事實上,我沒有成功地嘗試過你的解決方案,因爲在我有同樣問題的標準中執行提取連接。但改變獲取模式是一個好主意(我將用我找到的解決方案編輯我的帖子) –

+0

很高興你找到了你的解決方案:) –