`
KuangYeYaZi
  • 浏览: 52596 次
文章分类
社区版块
存档分类
最新评论

Hibernate @OneToMany的mappedBy和@JoinColumn总结

 
阅读更多

在一对多和多对一双向关联时:

  @OneToMany(cascade=ALL)

  // @JoinColumn(name="s_class") //如果一端设置了@JoinColumn,那么它的name和多端的@joinColumn的name是一样的。

  //但如果设置的是mappedBy的话,那么它的值和多端的getCla的"cla"是一样的。

  public Set<Student> getStudents() {

  return students;

  }

  @ManyToOne

  @JoinColumn(name="s_class")

  public SClass getCla() {

  return cla;

  }

  下面是在一端设置各自属性时输出的SQL语句:

  mappedBy:

  Hibernate: insert into SClass (name) values (?)

  Hibernate: insert into Student (s_class, name) values (?, ?)

  Hibernate: insert into Student (s_class, name) values (?, ?)

  @JoinColumn:

  Hibernate: insert into SClass (name) values (?)

  Hibernate: insert into Student (s_class, name) values (?, ?)

  Hibernate: insert into Student (s_class, name) values (?, ?)

  Hibernate: update Student set s_class=? where id=?

  Hibernate: update Student set s_class=? where id=?

  我发现mappedBy和@JoinColumn还有一个区别是,在一端设置了@JoinColumn的时候,主控制方在一端,

  也就是在一端set多端的时候,数据库会为你保存级联关系(在多端指向一端的外键设置值了)。

  SClass c=new SClass();

  c.getStudents()。add(s);

  c.getStudents()。add(s1);

  session.save(c);

  这样就行了。但还是建议设置mappedBy让多端设置这种关联比较好。

  两者都不用的时候会为OneToMany新建一个关联表SClass_Student.

  Hibernate: insert into SClass (name) values (?)

  Hibernate: insert into Student (s_class, name) values (?, ?)

  Hibernate: insert into Student (s_class, name) values (?, ?)

  Hibernate: insert into SClass_Student (SClass_id, students_id) values (?, ?)

  Hibernate: insert into SClass_Student (SClass_id, students_id) values (?, ?)

 

http://itlab.idcquan.com/Java/Hibernate/963761.html

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics