O/R映射是ORM框架中最为关键的组成部分了。其中的实体映射介绍hibernate中类和表之间的映射属性字段的基本技术
问题:数据库中有一个表【T_User】,其中字段有【ID】、【name】,那么如何在hibernate中建立一个对应的映射呢?
Hibernate 选用xml 作为类表映射配置媒介(默认为.hbm.xml后缀),通过xml可以将表T_User 映射到hibernate中。
系统中建立对应的T_User类:
<span style="font-family:Verdana;font-size:14px;">Public class TUser { PrivateInteger id; PrivateString name; PublicTUser (){} PublicInteger getID(){ Return this.id; } Public void setID(){ Return this.id; } Public Integer getID(){ Return this.id; } PublicInteger getID(){ Return this.id; } PublicString getName(){ Return this.name; } Publicvoid setName(){ Return this.name; } }</span>
建立TUser.hbm.xml
<span style="font-family:Verdana;font-size:14px;"><?xml version=”1.0” encoding = “UTF-8”?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <!—配置文件根结点 -- > <hibernate-mapping> <!—类名/表明映射:name为映射的类名;table为数据库表名 --> <class name=”com.redsaga.hibernate.db.entity.TUser”table =” T_User”> <!—id映射 :id表中主键;tyep 表明该字段的数据类型;native:将主键生成机制的实现方式交给hibernate决定-- > <Id name =”Id” column=”id” type=”java.lang.Integer”> <generator class=”native”/> </id> <!—属性/字段映射 -- > <property name=”name” column =”name” type=”java.lang.String”/> </class> </hibernate-mapping></span>
主键生成机制:数据库提供的主键生成机制会在进行例如插入操作时降低效率和增加互锁几率。主键生成机制:数据库内部对当前表的主键进行状态保存和维护,如果进行数据库表的操作,那么会首先操作/更新主键,伴随着多次的表读写操作,涉及加锁解锁问题,这样大批量操作时就可能降低性能。
主键关联:两张表通过主键形成一对一映射关联。身份证T_User和护照T_Passport
【T_User】:id (pk)、name、age
【T_Passport】 :id(pk)、country、date
TUser.hbm.xml :
<span style="font-family:Verdana;font-size:14px;"><!—配置文件根结点 -- > <hibernate-mapping> <!—类名/表明映射:name为映射的类名;table为数据库表名 --> <class name=”com.redsaga.hibernate.db.entity.TUser”table =” T_User”> <!—id映射 :id表中主键;tyep 表明该字段的数据类型;native:将主键生成机制的实现方式交给hibernate决定-- > <Id name =”Id” column=”id” type=”java.lang.Integer”> <generator class=”native”/> </id> <!—属性/字段映射 -- > <property name=”name” column =”name” type=”java.lang.String”/> <property name=”age” column =”name” type=”java.lang.Integer”/> <!— name:一对一映射节点 ;cascade:级联关系-- > <one-to-one name=”Tpassport ” class=”com.redsaga.hibernate.db.entity.TPassport”cascade=”all” outer-join =”true” > </class> </hibernate-mapping></span>
其中通过one-to-one节点,将TUser 和 TPassport 两个类进行关联。
级联关系cascade 设置为all表示当主控方(身份证是护照的主控方)进行操作时,关联对象也要进行相应的操作。
TPassport.hbm.xml:
<span style="font-family:Verdana;font-size:14px;"><!—配置文件根结点 -- > <hibernate-mapping> <!—类名/表明映射:name为映射的类名;table为数据库表名 --> <class name=”com.redsaga.hibernate.db.entity.TPassport”table =” T_Passport”> <!—id映射 :id表中主键;tyep 表明该字段的数据类型;foreign:主键生成 -- > <Id name =”Id” column=”id” type=”java.lang.Integer”> <generator class=”foreign”/> <param name=”property>user</param>” </generator> </id> <!—属性/字段映射 -- > <property name=”country” column =”country” type=”java.lang.String”/> <property name=”date” column =”date” type=”java.lang.String”/> <!— name:一对一映射节点 ;constrained:具有主键约束-- > <one-to-one name=”Tuser ” class=”com.redsaga.hibernate.db.entity.Tuser”constrained=”true” > </class> </hibernate-mapping></span>
One-to-one 中的constrained属性设定为true既告诉hibernate当前主键存在一个约束:T_passport引用了T_user表中的主键,这样两张表就建立了主键关联方式。这样当其中一张表中的主键产生变化时,另一张表中的主键也会产生相对应的变化。
唯一外键关联:
通常我们会遇到这样的情况,一张表的主键是另一张表的外键,例如学生的实体属性中存在教师的id,那么这样的情况在hibernate中是这样体现的:
【T_Student】studentid(pk)、name、teacherid、
【T_Teacher】teacherid(pk)、name。
与主键关联的不同点就是它不再使用one-to-one节点进行配置,而是使用many-to-one进行配置。One-to-one是一对一的意思,而many-to-one则是多对一意思。唯一外键关联其实是多对一的特例。
例如这两张表在系统中对应的类分别为TStudent和Tteacher在配置文件中唯一不同的就是只需要在Tteacher.hbm.xml配置一下信息:
<span style="font-family:Verdana;font-size:14px;"><many-to-one name=”TStudent” class=”com.redsaga.hibernate.db.entity.TStudent” column=”teacherid” unique=”true”/></span>
如此配置我们就可以通过学生获取其对应教师的属性。