Hibernate关联关系配置
一对一单向外键关联
举例:比如丈夫和妻子的关系为一对一关系
妻子:编号,姓名
丈夫:编号,姓名,引用妻子对象
Annotation配置:在husband类中private Wife wife; @OneToOne @JoinColumn(name="wifeId") public Wife getWife(){ returen wife; }
说明:husband表中默认生成wife_id,使用@JoinColumn可以自定义列名字
XML配置:在husband的映射关系配置文件中,采用many-to-one+unique的方式<many-to-one name="wife" column="wifeId" unique="true"></many-to-one>
一对一双向外键关联
妻子:编号,姓名,引用丈夫对象
丈夫:编号,姓名,引用妻子对象
Annotation配置:husband类中的配置不变,在wife类中配置如下private Husband husband; @OneToOne(mappedBy="wife") public Husband getHusband(){ return husband; }
说明:mappedBy是将映射关系交于husband类中的wife属性来处理,生成的wife表中将不存在husband_id字段
XML配置:husband的配置不变,在wife的映射关系配置文件中<one-to-one name="husbandId" property-ref="wife"></one-to-one>
说明:property-ref是将其交由husband类中的wife属性处理
多对一单向关联
举例:用户和用户组是多对一的关系
用户:编号,姓名,用户组的引用
用户组:编号,组名
Annotation配置:在User类中private Group group; @ManyToOne public Group getGroup(){ return group; }
XML配置:在User的映射文件中
<many-to-one name="group" column="groupId"/>
一对多单向关联
用户组:编号,组名,用户的set集合
用户:编号,姓名
Annotation配置:private Set<User> users = new HashSet<User>(); @OneToMany @JoinColumn(name="groupId") public Set<User> getUsers(){ return users; }
说明:加入名为groupId的外键,否则会生成另一张中间表
XML配置:在用户组的配置文件中<set name="users"> <key column="groupId"><key/> <one-to-many class="User类全路径"/> </set>
一对多/多对一双向关联
用户组:编号,组名,用户的set集合
用户:编号,姓名,用户组的引用
Annotation配置:
多方,User类中getGroup方法上加注解@ManyToOne
一方,Group类中getUsers方法上加注解@OneToMany(mappedBy=”group”)
XML配置:即多对一单向和一对多单向的xml配置的合并,注意外键名groupId要一致多对多单向关联
举例:老师和学生的关系为多对多
老师:编号,姓名,学生集合
学生:编号,姓名
Annotation配置:在老师类中private Set<Student> stus = new HashSet<Student>(); @ManyToMany @JoinTable(name="t_s", joinColumns={@JoinColumn(name="teacher_id")}, inverseJoinColumns={@JoinColumn(name="student_id")} ) public Set<Student> getStus(){ return stus; }
说明:t_s定义中间表名,joinColumn定义中间表中参考teacher表主键的名字,inverseJoinColumns定义中间表中参考student表主键的名字
XML配置:在teacher的配置文件中<set name="stus" table="t_s"> <key column="teacher_id"></key> <many-to-many class="Student全路径" column="student_id"/> </set>
多对多双向关联
老师:编号,姓名,学生集合
学生:编号,姓名,老师集合
Annotation配置,多对多单向关联的基础上,在Student类中:private set<Teacher> teas = new HashSet<Teacher>(); @ManyToMany(mappedBy="stus") public Set<Teacher> getTeas(){ return teas; }
XML配置:在Student的配置文件中
<set name="teas" table="t_s"> <key column="student_id"></key> <many-to-many class="Teacher全路径" column="teacher_id"/> </set>
注:一对一的关联关系中还包含主键关联,但是此情况基本不用,所以本文省略。