如何在hibernate中插入ManyToOne关系记录?

时间:2013-07-30 01:42:19

标签: java hibernate java-ee

我有以下两个课程,

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();

我可以插入到Know表中,但是hibernate不会将任何记录插入到已创建的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

2 个答案:

答案 0 :(得分:2)

用于@OneToMany(fetch = FetchType.LAZY)@OneToMany(fetch = FetchType.EAGER)的所选案例更改,以便您可以在其列表中获取数据。

对于插入内容,我需要澄清一下private Factory fac;的关系或吸气剂设定者在哪里?

你至少应该有这样的东西:

@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?

答案 1 :(得分:1)

您还需要使用session.Update(studentObject),在student_know表中插入一行。

另请注意,在打开的Hibernate会话的上下文之外访问延迟关联将导致异常。 Link