我是这个论坛的新手,希望我没有做错任何事情。
我从一个月前开始学习Java,但是有一个小问题。
我有2个实体,我想打印CD及其轨道,但有一个例外:
线程“主”中的异常java.lang.StackOverflowError

我不知道如何解决这个问题。
我发布了代码和实体:

追踪

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;
    }

}




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()中不包括轨道,要么在方法TbTrack.toString()中不包括CD。我建议使用后者,因为组装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;
    }
}

08-18 12:21
查看更多