1.数据库表有三种关系
a.一对一
b.多对一/一对多
c.多对多/单向或双向关联
2.在hibernate中把表关系的概念引用到java对象中来,以下是多对一的关系
班级类是一,学生类是多
那么在配置映射文件Student.hbm.xml文件中的配置为
<hibernate-mapping>
<!-- student类和数据库中t_user表进行对应 -->
<class name="onetomany.Students" table="t_students">
<!-- 主键配置 student.id属性和t_user.t_id字段对应 -->
<id name="studentId" column="t_id">
<!-- 主键生成器:以何种方式生成主键 -->
<generator class="native"></generator> </id>
<!-- 非主键属性 -->
<property name="studentName" column="t_name"></property>
<many-to-one name="clazz" column="t_clazz_id" cascade="save-update"></many-to-one>
</class>
<!-- 多对一配置 以 student类的属性clazz,所对应的Clazz的类,所对应的数据库表的属性t_clazz_id为外键--有点绕,多思考下就明白了>
//cascade="save-update"配置是该类与Clazz类的级联关系,设置为save-update是指只在添加和修改时级联,删除时不级联
</hibernate-mapping>
3.一对一关系
a.表结构,主键关联:单向,一张表的主键作为外键,参考另一张表的主键)
其中,person表的id作为外键,参考的是IdCard表的主键...因此Person任何一行都参考了IdCard,并且主键本身唯一,确保了Person和IdCaed一对一的关系,
b.在person.hbm.xml映射配置如下
<hibernate-mapping>
<class name="one2one.primarykey.single.Person" table="t_person">
<id name="id" column="t_id">
<!-- Person的主键依赖于自己的成员变量idCard所表示的类型IdCard,,,所映射的表t_idcard的主键t_id -->
<generator class="foreign">
<param name="property">idCard</param>
</generator>
</id>
//表示在生成数据表时会加上主外键约束
<one-to-one name="idCard" constrained="true"></one-to-one>
</class>
</hibernate-mapping>
c.唯一外键关联,也就是在person中设置外键+设置唯一性约束(非主键);
其中IdCard是多的一方,该类有person集合;
public class IdCard {
private int id;
private long number;
private Person person;
public Person getPerson() {
return person;
}
public void setPerson(Person person) {
this.person = person;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public long getNumber() {
return number;
}
public void setNumber(long number) {
this.number = number;
}
映射文件配置
<hibernate-mapping>
<class name="one2one.primarykey.single.IdCard" table="t_idcard">
<id name="id" column="t_id">
<generator class="native"></generator>
</id>
<property name="number" column="t_number"></property>
<one-to-one name="person"></one-to-one>
</class>
</hibernate-mapping>