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