我正在使用hibernate进行DBS映射。我有Dokument类:
@Entity
@Table(name = "DOKU")
public class Dokument implements Serializable {
@Id
@GeneratedValue
@Column(name = "id")
private int id;
@Column
private String val;
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "RELATIVES",
joinColumns = {@JoinColumn(name = "DOK1_ID")},
inverseJoinColumns = {@JoinColumn(name = "DOK2_ID")})
private Set<Dokument> iPoint = new HashSet<>();
@ManyToMany(mappedBy = "iPoint", cascade = CascadeType.ALL)
private Set<Dokument> pointMe = new HashSet<>();
测试代码:
Session session = HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();
Dokument dok = new Dokument("master");
Dokument d1 = new Dokument("slave");
dok.getiPoint().add(d1);
session.save(dok);
session.save(d1);
session.getTransaction().commit();
session.close();
它可以在DBS中正确保存所有内容。 当我试图通过以下方式阅读它时:
Session session = HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();
Dokument read = (Dokument) session.get(Dokument.class, 31);
System.out.println(read.getiPoint());
session.close();
我得到getiPoint引起的堆栈溢出异常。 session.get自己工作。 你看到代码中有任何错误吗?谢谢。
//编辑 我让Netbeans生成那些方法,仍然是同样的错误
@Override
public int hashCode() {
int hash = 5;
hash = 97 * hash + this.id;
return hash;
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final Dokument other = (Dokument) obj;
if (this.id != other.id) {
return false;
}
return true;
}
答案 0 :(得分:1)
提供问题的代码行是System.out.println(read.getiPoint());
,实际上是两个操作。将它们拆分为:
Set<Dokument> mySet = read.getiPoint();
System.out.println(mySet);
然后重新开始,你会发现你的StackOverflowException
来自第二行。检查Dokument.toString()
方法,它会导致您的问题。
答案 1 :(得分:0)
对不起伙计,我的大错。我的Document.toString是:
@Override
public String toString() {
return "Dokument{" + "id=" + id + ", val=" + val + ", iPoint=" + iPoint + ", pointMe=" + pointMe + '}';
}
所以它保持iPointing和iPointing。对不起我的注意力不集中。