hibernate映射关系
映射关系相关属性详解
name:属性的名字,同时是对用类的属性名字。
table:创建后的表名
class (可选 - 默认是通过反射得到的属性类型):被关联的类的名字。
column:主键对应的属性名,key标签的colum表示外键
-
generator:表示主键的生成方式
常见主键生成方式
1.increment:主键递增生成,其生成方式与底层数据库无关,大部分数据库都支持,该方式的实现机制是在当前应用实例中维持一个变量,以保存着当前的最大值,之后每次需要生成主键的时候将此值加1作为转。其不足之处是当多个线程并发对数据库表进行写操作时,可能出现相同的主键值,发生主键重复的冲突,所以在多线程并发操作的时候不应该使用该方法。
<generator class="increment" />
2.identity:与底层数据库有关,要求数据库支持Identity,如MySQL中auto_increment,SQL Server中的identity。支持的数据库有MySQL,SQL Server,DB2,Sybase,但是不支持oracle.支持并发。
<generator class="identity" />
3.assigned:主键由外部程序负责生成,无需Hibernate参与。----如果要由程序代码来指定主键,就采有这种。
<generator class="assigned" />
4.sequence:使用序列生成主键,需要底层数据库支持
在数据库中建一个序列
create sequence seq_name increment by 1 start with 1; 在映射文件中指定使用序列的名字 <generator class="sequence"> <param name="sequence">seq_name</param> </generator>
property:普通属性的标签
constrained(约束) (可选):表明该类对应的表对应的数据库表,和被关联的对象所对应的数据库表之间,通过一个外键引用对主键进行约束。
这个选项影响save()和delete()在级联执行时的先后顺序unique:是在使用hibernate的自动建表的时候才用到,uniq="true"用来指定表中的外键唯一,即给表中的外键添加唯一性约束,保证是一对一的关系。
property-ref:用来指定关联类的属性名,这个属性将会和本类中的主键相对应,如果没有指定,默认使用关联类的主键和本类中的主键相对应。
lazy:true/false,session是否延迟查询所需要的对象的相关属性
-
cascade(级联) (可选):表明操作是否从父对象级联到被关联的对象。
级联的类型
lazy="none":在保存,更新,删除当前对象的时候忽略其他关联的对象。是cascade的默认值
lazy="save-update":当通过Session的save(),update(),saveOrUpdate()方法来保存或者更新当前对象的时候级联保存所有关联的临时对象,级联更新所有关联的游离对象。
lazy="delete":当通过Session的delete()方法删除当前对象的时候级联删除所有关联的对象。
lazy="all":包含save-update和delete的行为。
lazy="delete-orphan":删除所有和当前对象解除关联关系的对象。(只能在set中配置)
lazy="all-delete-orphan": 包含all和delete-orphan的行为
inverse:负责控制关系,inverse真正的作用是指定由哪一方来维护之间的关联关系,当一方指定inverse="false"那么这一方就有责任负责之间的关联关系。.需要将其中的一方inverse="true",默认为false,只能显示在<set>放进行设置。
映射关系类型
-
一对一
一个人对应一张身份证,一张身份证对应一个人
person配置文件信息:<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.briup.day05.one2one"> <class name="Person" table="tbl_person"> <id name="id" column="id"> <generator class="increment" /> </id> <property name="name" /> <!-- 在主方配置一对一 --> <one-to-one name="card" class="Card" /> </class> </hibernate-mapping>
card配置文件信息:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.briup.day05.one2one">
<class name="Card" table="tbl_card">
<id name="id" column="id">
<generator class="increment" />
</id>
<property name="number"/>
<property name="address"/>
<many-to-one name="person" class="Person"
unique="true"
column="p_id"></many-to-one>
<!-- column是外键 -->
</class>
</hibernate-mapping>
-
一对多
一位顾客对应多个订单,多个订单对应一位顾客
customer配置文件信息:<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.briup.day05.one2many"> <class name="Customer" table="tbl_customer"> <id name="id" column="id"> <generator class="increment"/> </id> <property name="name"/> <property name="telephone"/> <property name="address"/> <!-- 关联映射 --> <set name="orders"> <key column="c_id"/> <one-to-many class="Order"/> </set> </class> </hibernate-mapping> *order配置文件信息:* <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.briup.day05.one2many"> <class name="Order" table="tbl_order"> <id name="id" column="id"> <generator class="increment"/> </id> <property name="total"/> <property name="orderDate"/> <!-- 关联映射 --> <many-to-one name="customer" class="Customer" column="c_id" /> </class> </hibernate-mapping>
-
多对多
多个学生对应多门课程,多门课程对应对个学生
由于student和course都是多对多所以配置信息一样:
配置文件信息:<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.briup.day06.many2many"> <class name="Student" table="tbl_student"> <id name="id" column="id"> <generator class="increment" /> </id> <property name="name" /> <property name="age" /> <set name="courses" table="tbl_student_course"> <key column="s_id"> </key> <many-to-many class="Course" column="c_id"></many-to-many> </set> </class> </hibernate-mapping>
在上面的配置文件中出现了一个table="tab_student_course"这样的标签,那么这个是什么呢?
在数据库中如果两个不同的实体出现了多对多的关系我们要给其中添加一个关系的对应表,我们称之为桥表,那么这里的table="tab_student_course"就是学生表和课程对应的桥表