Hibernate映射关联关系
- 格式:doc
- 大小:44.00 KB
- 文档页数:16
hibernate基本映射实体类---表实体类中的普通属性---表字段采用<class>标签映射成数据库表,通过<property>标签将普通属性映射成表字段。
所谓普通属性指不包括自定义类、集合和数组等。
注意:如果实体类和实体类中的属性和sql中的关键字重复,必须采用table或column重新命名。
实体类的设计原则:* 实现一个默认的(即无参数的)构造方法(constructor)(必须)。
* 提供一个标识属性(identifier property)(可选)。
* 使用非final的类(可选)(无法继承和复写,而lazy是通过实体类的子类来实现的,即无法使用lazy)。
* 为持久化字段声明访问器(accessors) (即get和set方法,也不可以不提供然后在配置中进行配置,但是不建议使用)。
主键生成策略:uuid、native和assigned一、hibernate多对一关联映射关联映射的本质:* 将关联关系映射到数据库,所谓的关联关系是对象模型在内存中的一个或多个引用。
<many-to-one>会在多的一端加入一个外键,指向一的一端,这个外键是由<many-to-one>中的column属性定义的,如果忽略了这个属性那么默认的外键与实体的属性一致。
经典配置:用户User和组GroupType。
多的User端配置:加入<many-to-one>标签。
<hibernate-mapping><class name="er" table="user" catalog="yuli"><id name="id" type="ng.Integer"><column name="id" /><generator class="native" /></id><property name="name" type="ng.String"> <column name="name" length="20" /></property><many-to-one name="groupType"column="grouptype" cascade="all"></many-to-one> </class></hibernate-mapping>一的GroupType端配置:不做任何改变。
<hibernate-mapping><class name="com.yuli.model.GroupType"table="grouptype" catalog="yuli"><id name="id" type="ng.Integer"><column name="id" /><generator class="native" /></id><property name="name" type="ng.String"> <column name="name" length="20" /></property></class></hibernate-mapping><many-to-one>标签的定义示例:* <many-to-one name="groupType"column="grouptype"></many-to-one>理解级联cascade的含义?* 是对象的连锁操作。
many-to-one:Persisent对象不能引用Transisent对象,因为Transisent状态没有分配oid值,会抛出TransisentObjectException异常。
采用cascade属性是解决TransientObjectException异常的一种手段。
<many-to-one name="groupType"column="grouptype" cascade="all"></many-to-one>二、hibernate一对一主键关联映射(单向关联Person---->IdCard)一对一主键关联映射:让两个实体对象的id保持相同,这样可以避免多余的字段被创建。
具体映射:Person一端配置:<hibernate-mapping><class name="com.yuli.model.Person" table="person" catalog="yuli" ><id name="id" type="ng.Integer" ><column name="id" /><!-- person的主键来源idCard,也就是共享idCard的主键--> <generator class="foreign" ><param name="property">idCard</param></generator></id><property name="name" type="ng.String"> <column name="name" length="20" /></property><!-- one-to-one标签的含义,指示hibernate怎么加载它的关联对象,默认根据主键加载,constrained="true",表明当前主键上存在一个约束,person的主键作为外键参照了idCard --><one-to-one name="idCard"constrained="true" ></one-to-one></class></hibernate-mapping>IdCard一端配置:<hibernate-mapping><class name="com.yuli.model.IdCard" table="idcard" catalog="yuli" ><id name="id" type="ng.Integer"><column name="id" /><generator class="native" /></id><property name="cardNo" type="ng.String"> <column name="cardno" length="20" /></property></class></hibernate-mapping>hibernate一对一主键关联映射(双向关联Person<---->IdCard)需要在idcard映射文件中加入<one-to-one>标签指向person,指示hibernate如何加载person默认根据主键加载。
<one-to-one name="person"/>其中<one-to-one name="idCard"constrained="true" ></one-to-one>constrained="true"设置成true负责约束外键生效。
此时不会出现TransientObjectException异常,因为一对一主键关联映射中,默认了cascade属性。
不可以配置cascade属性。
如果配置cascade="false"会报如下异常:org.hibernate.MappingException: Unsupported cascade style: false如果配置cascade="true"会报如下异常:org.hibernate.MappingException: Unsupported cascade style: truehibernate一对一唯一外键关联映射(单向关联Person---->IdCard)说明:一对一唯一外键关联映射是多对一关联映射的特例。
可以采用<many-to-one>标签,指定多的一端的unique=true,这样就限制了多的一端的多重性唯一,通过这种手段映射一对一唯一外键关联。
Person端配置:<hibernate-mapping><class name="com.yuli.model.Person" table="person"><id name="id"><generator class="native"/></id><property name="name"/><!-- 采用多对一配置标签,多的一端设置unique唯一--><many-to-one name="idCard" unique="true"/></class></hibernate-mapping>IdCard端配置:不做改变。