1

互いに一方向の1対多の関係を持つ2つのクラスがあります。

public class Offer{
    ...
    @OneToMany(cascade=CascadeType.ALL)
    @JoinTable(name = "Offer_Fields",
    joinColumns =
    @JoinColumn(name = "OFFER_ID"),
    inverseJoinColumns =
    @JoinColumn(name = "FIELDMAPPER_ID"))
    private Set<FieldMapper> fields = new HashSet<FieldMapper>();
}


@Entity
@Table(name = "FieldMapper")
public class FieldMapper implements Serializable {
   @Id
   @Column(name = "FIELDMAPPER_ID")
   @GeneratedValue
   private int id;
   @OneToOne(cascade=CascadeType.ALL)
   @JoinColumn(name = "multilingual_field_fk")
   private MultiLingual field;
   @OneToOne(cascade=CascadeType.ALL)
   @JoinColumn(name = "multilingual_value_fk")
   private MultiLingual value;
}

データベースに FieldMapper のセットを含むオファーを保存したいと考えています。OneToMany で CascadeType.ALL を使用すると、次のエラーが発生しました。

org.hibernate.HibernateException: Illegal attempt to associate a collection with two open sessions

CascadeType を別のものに変更すると、次のエラーが発生しました。

org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.RCSTT.library.FieldMapper

そして、ここに Offer を保存します:

public void insert(Offer offer) throws SQLException {
    Session session = HibernateUtil.getSession();
    Transaction tx = session.beginTransaction();
    session.save(offer);
    tx.commit();
    session.close();
}

他の場所ではセッションを使用しません。

tx.commit();インラインスローは説明された例外をスローします。

ご協力いただきありがとうございます。

4

1 に答える 1

0

最初の例外は、これがマッピング/エンティティの問題ではなく、オブジェクトのライフサイクルまたはHibernateセッションの処理方法に問題があると私に信じさせます。

保存しようとしているFieldMappersは(別のセッションで)すでに永続的ですか?最初にそれらを切り離す必要があるかもしれません。

于 2010-05-24T22:03:49.543 に答える