Hibernate:
表示层–业务逻辑层–持久层–数据库层
域模型(实体模型),面向对象的概念
关系模型,是关系型数据库的概念
ORM(Object Relational Mapping),对象关系映射
关系模型映射成对象模型
Hibernate就是实现ORM的框架
Hibernate对象状态(Object States)
瞬时(Transient)态:由new操作符创建,且尚未与Hibernate Session关联的对象被认为瞬时的。
持久(Persistent)态:持久的实例在数据库中有对应的记录,并拥有一个持久化标识(identifiy)。
脱管(Detached)态:与持久对象关联的Session被关闭后,对象就变为脱管态。
<hibernate-mapping package="net.zhx.po">
<class name="Student" table="t_student">
<id name="id" column="sid">
<!-- Id生成策略 -->
<generator class="native"></generator>
</id>
</class>
</hibernate-mapping>
Id生成策略:
uuid
uuid2
native
assigned:需要手动设置id,默认
Hibernate 映射
基本映射
关联映射
一对一(one-one)
一对多(one-many,many-one)
多对多(many-many)
一对多(One-to-Many)
<hibernate-mapping package="net.zhx.po">
<class name="User" table="t_user">
<id name="id" column="uid">
<generator class="native"></generator>
</id>
<property name="name" length="20"></property>
<property name="password"></property>
<many-to-one name="group" foreign-key="fk_user_groupid_group_gid">
<column name="group_id"></column>
</many-to-one>
</class>
</hibernate-mapping>
Lazy策略(懒加载,延时加载)
Hibernate支持的Lazy策略只有在session打开的状态下才有效
User user = (User)session.load(User.class, 1);
User user = (User)session.get(User.class, 1);
Load是支持Lazy加载的:在真正使用对象的时候才会去发SQL查询
一对一(One-to-One)
主键参照(让两个实体对象的ID保持相同)
外键参照(可以看作特殊的多对一关系)
多对一(Many-to-One)
<hibernate-mapping package="net.zhx.po">
<class name="Student" table="t_student">
<id name="id" column="sid">
<generator class="native"></generator>
</id>
<property name="name"></property>
<many-to-one name="classes" foreign-key="fk_student_cid_classes_cid">
<column name="cid"></column>
</many-to-one>
</class>
</hibernate-mapping>
多对多(Many-to-Many)
<hibernate-mapping package="net.zhx.po">
<class name="User" table="t_user">
<id name="id" column="uid">
<generator class="native"></generator>
</id>
<property name="name"></property>
<!-- table="r_user_role":指定中间表的名称 -->
<set name="roles" table="r_user_role">
<!-- 在中间表里面关联上自己id的字段名和外键名 -->
<key column="uid" foreign-key="fk_userrole_uid_user_uid"></key>
<many-to-many class="Role" foreign-key="fk_userrole_rid_role_rid">
<column name="rid"></column>
</many-to-many>
</set>
</class>
</hibernate-mapping>
<hibernate-mapping package="net.zhx.po">
<class name="Role" table="t_role">
<id name="id" column="rid">
<generator class="native"></generator>
</id>
<property name="name"></property>
<set name="users" table="r_user_role">
<key column="rid" foreign-key="fk_userrole_rid_role_rid"></key>
<many-to-many class="User" foreign-key="fk_userrole_uid_user_uid" column="uid"></many-to-many>
</set>
</class>
</hibernate-mapping>
继承映射(三种策略)
–单表继承(每颗类继承树使用一张表)—>(好处:节约表 坏处:子类的字段必须不能不为空)
–具体表继承(父类和每个子类各一张表,子类表只有id和自己的属性)
–类表继承(每个具体类一张表)
其他映射
–组件映射(Component Mapping)
–联合主键映射(Composite Mapping)
–集合映射(Set,List,Array,Map)
–自关联