Java自学之路-Java中级教程-41:Hibernate一对多@OneToMany和多对一@ManyToOne的数据关系

除了一对一的关系,还有一对多,上一节是一个人只能生一个孩子,现在实行多胎制,一个人可以有多个孩子,但这些孩子的父亲只能是这一个人。


在Person.java中定义一个属性subs,这些subs也可以是Person类。这里使用@OneToMany作为注解一对多关系,这个多方是一个集合Set。需要注意的是,这里要多加一个@JoinColumn(name="parent_id"),指的是按照哪个字段查询关联到这些子记录。


      @OneToMany
    @JoinColumn(name="parent_id")
    private Set subs;    public Set getSubs() {  return subs;  }  public void setSubs(Set subs) {  this.subs = subs;  }


可以这样说,如果一个人是另一个人的父亲,这另一个人就可以有别的孩子。在页面里多添加几个Person的记录13,、14、15,父亲都设置为11,那么这些记录就是第11条记录的孩子们。


这里用了@OneToMany,就需要@ManyToOne相配合使用。一对多的另一面就是多对一,应该在一的那一方加注解@ManyToOne,这里就是parent属性

//    @OneToOne
@ManyToOne
private Person parent;

同样在页面里把subs属性显示出来,但这里可能会遇到failed to lazily initialize a collection的错误。这个错误是因为懒加载lazy,也就是前面提到的延迟加载。解决这个问题,可以在@OneToMany的参数中使用fetch=FetchType.EAGER。这里的FetchType就是查询类型,有EAGER立即加载和LAZY延迟加载,这里使用EAGER。


    @OneToMany(fetch=FetchType.EAGER)
    @JoinColumn(name="parent_id")
    private Set subs;





Java视频教程



猜你喜欢

转载自blog.csdn.net/weixin_41239710/article/details/80953210