0

DBS マッピングに休止状態を使用しています。私はドキュメントクラスを持っています:

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

2 に答える 2

1

問題を引き起こしているコード行は、System.out.println(read.getiPoint());実際には 2 つの操作です。それらを次のように分割します。

Set<Dokument> mySet = read.getiPoint();
System.out.println(mySet);

再実行すると、あなたがStackOverflowException2行目から来ていることがわかります。メソッドを確認してDokument.toString()ください。問題の原因となっています。

于 2013-03-25T17:29:22.253 に答える
0

申し訳ありませんが、私の大きな間違いです。私の Document.toString は次のとおりです。

@Override
public String toString() {
    return "Dokument{" + "id=" + id + ", val=" + val + ", iPoint=" + iPoint + ", pointMe=" + pointMe + '}';
}

そのため、iPointing と iPointing が保持されます。不注意で申し訳ありません。

于 2013-03-27T08:49:30.003 に答える