2010-05-24 43 views
1

我有兩個具有彼此單向一對多關係的類。一對多關係中的級聯類型問題

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的提議到數據庫。 當我在一對多使用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 

這裏是我救發售:

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

,我不別的地方使用會話。

in tx.commit(); line throws explain exceptions。

感謝您的幫助。

+0

出於好奇,是一對多關係涉及表中相同的一組列?我只是想知道這在數學上是可能的。 – 2010-05-24 20:24:59

+0

編號 每個類在其自己的表中都有自己的列,但在我的情況下,將創建一個Join表來管理關係(您可以在沒有連接表的情況下創建一對多關係)。 – 2010-05-24 20:43:44

+0

那麼,發佈FieldMapper類的代碼可能會很有用。出於某種原因,我相信這是一個ManyToMany關係。 – 2010-05-25 12:54:34

回答

0

第一個異常讓我相信這不是你的映射/實體的問題,而是與對象生命週期或Hibernate會話的處理方式有關。

您嘗試保存的FieldMapper是否已經存在(在另一個會話中)?您可能需要先將它們分開。

+0

不,他們只是在我想要保存Offer時在java代碼中創建。它們不是持久的,所以當我將cascadeType更改爲其他內容時,我得到了這個:「對象引用未保存的瞬態實例」。這意味着他們不是持久的。 – 2010-05-25 04:49:02

+0

你的休眠會話是如何處理的?如果集合(字段)與兩個打開的會話同時關聯,則會發生此異常。 因此,如果您例如使用一個會話查找優惠,然後嘗試使用不同的會話保存相同的優惠,則會發生此異常。 – 2010-05-25 10:57:46

+0

不,代碼中也創建了優惠。你是什​​麼意思關於如何處理hibernate會話? – 2010-05-25 12:39:39