[英]Java- ToString() in a Java Bean generated with Hibernate caused StackOverflowError
我是這個論壇的新手,所以我希望我沒做錯任何事情。我一個月前開始學習Java,但是我有一個小問題。 我有2個實體,我想打印帶有其軌道的CD,但是我有這個異常:線程“ main”中的異常java.lang.StackOverflowError
我不知道如何解決此問題。我發布了代碼和實體:
TbTrack
package it.tgi.cd.entities2;
// default package
// Generated 11-mag-2015 16.29.34 by Hibernate Tools 4.0.0
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import static javax.persistence.GenerationType.IDENTITY;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
/**
* TbTrack generated by hbm2java
*/
@Entity
@Table(name = "tb_track", catalog = "db_cd_store")
public class TbTrack implements java.io.Serializable {
private Integer idTrack;
private TbCd tbCd;
private String title;
public TbTrack() {
}
public TbTrack(TbCd tbCd, String title) {
this.tbCd = tbCd;
this.title = title;
}
@Override
public String toString() {
return "idTrack=" + idTrack + ", tbCd=" + tbCd + ", title=" + title;
}
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "id_track", unique = true, nullable = false)
public Integer getIdTrack() {
return this.idTrack;
}
public void setIdTrack(Integer idTrack) {
this.idTrack = idTrack;
}
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "id_cd", nullable = false)
public TbCd getTbCd() {
return this.tbCd;
}
public void setTbCd(TbCd tbCd) {
this.tbCd = tbCd;
}
@Column(name = "title", nullable = false, length = 45)
public String getTitle() {
return this.title;
}
public void setTitle(String title) {
this.title = title;
}
}
TBCD
package it.tgi.cd.entities2;
// default package
// Generated 11-mag-2015 16.29.34 by Hibernate Tools 4.0.0
import java.util.HashSet;
import java.util.Set;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
/**
* TbCd generated by hbm2java
*/
@Entity
@Table(name = "tb_cd", catalog = "db_cd_store")
public class TbCd implements java.io.Serializable {
private int idCd;
private String title;
private Set<TbTrack> tbTracks = new HashSet<TbTrack>(0);
public TbCd() {
}
public TbCd(int idCd, String title) {
this.idCd = idCd;
this.title = title;
}
@Override
public String toString() {
return "idCd=" + idCd + ", title=" + title + ", track= " + tbTracks;
}
public TbCd(int idCd, String title, Set<TbTrack> tbTracks) {
this.idCd = idCd;
this.title = title;
this.tbTracks = tbTracks;
}
@Id
@Column(name = "id_cd", unique = true, nullable = false)
public int getIdCd() {
return this.idCd;
}
public void setIdCd(int idCd) {
this.idCd = idCd;
}
@Column(name = "title", nullable = false, length = 45)
public String getTitle() {
return this.title;
}
public void setTitle(String title) {
this.title = title;
}
@OneToMany(fetch = FetchType.LAZY, mappedBy = "tbCd")
public Set<TbTrack> getTbTracks() {
return this.tbTracks;
}
public void setTbTracks(Set<TbTrack> tbTracks) {
this.tbTracks = tbTracks;
}
}
CDDAO2
package it.tgi.cd.dao2;
import it.tgi.cd.connection2.DBConnection2;
import it.tgi.cd.entities2.TbCd;
import java.util.Iterator;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
public class CDDAO2 {
public static void searchCD(String title) {
Session session = DBConnection2.openConnection();
String query = "FROM TbCd where title='" + title + "'";
Query _query = session.createQuery(query);
List<TbCd> list = _query.list();
System.out.println(list);
DBConnection2.closeConnection(session);
}
}
你能幫我嗎? 謝謝!
您要在軌道類中添加CD 字符串 ,並且要在CD類中添加所有軌道字符串 。
這是無限遞歸:CD字符串包含一個軌道字符串(以及其他),此軌道字符串包含CD字符串(與開始時相同!),而CD字符串又包含軌道字符串,依此類推。
解決方法是不包括在該方法的曲目TbCd.toString()
或不包括該方法中的CD TbTrack.toString()
我建議使用后者,因為組裝CD字符串時可能打算包含所有軌道:
public class TbCd implements java.io.Serializable {
@Override
public String toString() {
return "idCd=" + idCd + ", title=" + title + ", track= " + tbTracks;
}
}
public class TbTrack implements java.io.Serializable {
@Override
public String toString() {
return "idTrack=" + idTrack + ", title=" + title;
}
}
當您這樣做時,它非常簡單:
@Override
public String toString() {
return "idCd=" + idCd + ", title=" + title + ", track= " + tbTracks;
}
它嘗試打印您的TbTrack對象集,該對象還將覆蓋toString方法,以便:
@Override
public String toString() {
return "idTrack=" + idTrack + ", tbCd=" + tbCd + ", title=" + title;
}
那么發生了什么:
它打印軌道列表,每個軌道的toString方法都被調用,該方法再次打印CD“ tbCD”,它試圖一次又一次地打印軌道uupps STACKOVERFLOW已達到!!!
從TbTrack類的toString中刪除“ tbCD = + tbCD”,一切正常。 而是打印例如titel;)
簡單的解決方法是:
@Override
public String toString() {
return "idTrack=" + idTrack + ", tbCd.Title=" + tbCd.title + ", title=" + title;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.