2013-07-30 70 views
1

我有兩個類,如下圖所示如何在Hibernate中插入ManyToOne關係記錄?

Human.java

@Entity 
@Inheritance(strategy = InheritanceType.JOINED) 
public class Human implements Serializable { 

    private long id; 
    private String name; 
    .... 
} 

Student.java

@Entity 
@DynamicUpdate 
public class Student extends MyFactories { 

    private List<Know> KnowList; 

    @OneToMany(fetch = FetchType.LAZY) 
    public List<Know> getKnowlist() { 
     return knowlist; 
    } 

    public void setKnowlist(List<Know> KnowList) { 
     return Knowlist; 
    } 
} 

Know.java

@Entity 
public class Know implements Serializable { 

    private long id; 
    private Human hu; 
    private Student st; 

    .... 

    @ManyToOne 
    public Person getHu() { 
     return hu; 
    } 

    @ManyToOne 
    public Client getSt() { 
     return st; 
    } 

    .... setters ..... 
} 

代碼

  Know kw = new Know(); 
      kw.setSt(studentObject); 
      kw.setHu(humanObject); 
      session.save(kw); 
      tx.commit(); 

我能夠插入到專有表,但休眠不插入任何記錄student_know它所創建的表。

我發現這個answer,但它說我需要使用該方法,如果我總是想檢索所有記錄。我不(有時,我可能只需要檢索其專有的學生類就不列出來)

System.out.println(this.student.getKnowList().size()); 

當我嘗試訪問它運行到以下情況例外列表中。

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.myproject.Student.knowList, could not initialize proxy - no Session 
+0

你有沒有看過這個?http://stackoverflow.com/questions/13199045/hibernate-many-to-one-mapping-should-i-insert-this-way –

+0

@ CPU100謝謝,但我有工廠和myfactories對象,但不知道如何將產品表連接到myfactories和工廠對象 –

+0

學生擴展MyFactories?客戶端getSt()'和變量'Student st'你的示例代碼真的可以工作嗎? – Angga

回答

1

您還需要使用session.Update(studentObject)將行插入到student_know表中。

另請注意,訪問開放Hibernate會話上下文之外的惰性關聯會導致異常。 Link

2

的選擇的情況下更改,@OneToMany(fetch = FetchType.LAZY)@OneToMany(fetch = FetchType.EAGER)這樣你可以得到的數據裏面的名單。

對於插入,我需要您澄清一下您的關係或private Factory fac;的getter setter的位置?

,你至少應該有這樣的事情:

@ManyToOne(cascade = CascadeType.ALL) 
@JoinColumn(name = "YOUR_FACTORY_ID_COLUMN") 
private Factory fac; 

public Factory getFac(){ 
    return fac; 
} 

public void setFac(Factory fac){ 
    this.fac=fac; 
} 

並沒有工廠有什麼ID?

+0

工廠從myfactories繼承它的id,我已經包含了所有的getter和setter,我不希望它在每次加載工廠對象時加載所有產品,因爲它們很多。 –

+0

他們只會加載該工廠內的所有產品,您的例外是因爲當您處於無法獲得會話的狀態時,您沒有獲得對象(產品)。所以唯一的方法就是在將這個對象移動到無會話狀態之前加載它(也許你把這個工廠發送給客戶端並試圖獲得它的產品)。 – Angga

+1

如果您的ID爲FK – Angga

相關問題