1.一对一
用户表可以查分成两个表,一个userInfo、一个userLogin表
实现方式:
(1)使用外键:外键+唯一性约束+非空约束
(2)公用主键:公用主键,从表的主键同时也是外键,来源于主表的主键。
2. 一对多
使用外键,实现一对多关系,外键可以为null
主从关系:一:主表,多:从表 ,从表的外键必须是主表的主键或者null。
实现方法:Student Clazz
step1:在一个一方创建对象引用集合 Set<>
private Set<Student> students = new HashSet<>(0);
step2:在多的一方创建对象引用
private Clazz clazz;
step3:在多方 实体中建立多对一关系-<many-to-one>【由多的一方维护关系】。
在一方配置<set>标签【可选】
public class Student implements Serializable { ???private Integer id; ???private String stuName; ???private Integer age; ???private Clazz clazz; ???//set,get省略}
public class Clazz implements Serializable { ???private Integer id; ???private String className; ???//实例化,可以防止空指针异常 ???private Set<Student> students = new HashSet<>(0); //长度设为0}
<hibernate-mapping package="cn.getword.domain"> ???<class name="Student" table="tb_student"> ???????<id name="id" column="id" type="int"> ???????????<generator class="native"></generator> ???????</id> ???????<property name="stuName" column="username" /> ???????<property name="age" column="age" /> ???????<!-- name:用于指定引用对象在类中属性名称 ????????????class:一方的类的路径 ????????????column:外键名称 ????????--> ???????<many-to-one name="clazz" class="Clazz" column="clazz_id" /> ???</class></hibernate-mapping>
<hibernate-mapping package="cn.getword.domain"> ???<class name="Clazz" table="tb_clazz"> ???????<id name="id" column="id" type="int"> ???????????<generator class="native"></generator> ???????</id> ???????<property name="className" column="class_name" /> ???????<!-- name:引用集合的名称 ????????????table:多方表明 ????????--> ???????<set name="students" table="tb_student"> ???????????<!-- key:多方表的外键名称 --> ???????????<key column="clazz_id"></key> ???????????<one-to-many class="Student"></one-to-many> ???????</set> ???</class></hibernate-mapping>
3. 多对多
使用中间表实现多对多关系。中间表只有两个字段,即两个表的主键,中间表的主键就是两个外键的联合主键。
end
hibernate表关系
原文地址:https://www.cnblogs.com/zhuxiang1633/p/9766865.html