Hibernate配置文件中映射元素详解

news/2025/2/21 16:58:28
class="baidu_pl">
class="article_content clearfix">
class="htmledit_views">

转载地址:http://www.ninedns.com/JSP/200742218371712403.html

 

本文中将讲述Hibernate的基本配置及配置文件的应用,这对于正确熟练使用Hibernate是相当关键的。

  配置文件中映射元素详解

  对象关系的映射是用一个XML文档来说明的。映射文档可以使用工具来生成,如XDoclet,Middlegen和AndroMDA等。下面从一个映射的例子开始讲解映射元素,映射文件的代码如下。

class="code"> <?xml version="1.0"?>
<!--
所有的XML映射文件都需要定义如下所示的DOCTYPE。
Hibernate会先在它的类路径(classptah)中搜索DTD文件。

-->
<!DOCTYPE class="tags" href="/tags/HIBERNATE.html" title=hibernate>hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://class="tags" href="/tags/HIBERNATE.html" title=hibernate>hibernate.sourceforge.net/class="tags" href="/tags/HIBERNATE.html" title=hibernate>hibernate-mapping-3.0.dtd">

<!--
class="tags" href="/tags/HIBERNATE.html" title=hibernate>hibernate-mapping有几个可选的属性:
schema属性指明了这个映射的表所在的schema名称。
default-cascade属性指定了默认的级联风格 可取值有 none、save、update。
auto-import属性默认让我们在查询语言中可以使用非全限定名的类名 可取值有 true、false。
package属性指定一个包前缀。
-->

class="tags" href="/tags/HIBERNATE.html" title=hibernate>hibernate-mapping schema="schemaName" default-cascade="none"
auto-import="true" package="test">

<!--用class元素来定义一个持久化类 -->
class name="People" table="person">
<!-- id元素定义了属性到 class="tags" href="/tags/ShuJuKu.html" title=数据库>数据库 表主键字段的映射。-->
<id name="id">
<!-- 用来为该持久化类的实例生成唯一的标识 -->
<generator class="native"/>
</id>
<!-- discriminator识别器 是一种定义继承关系的映射方法-->

<discriminator column="subclass" type="character"/>
<!-- property元素为类声明了一个持久化的,JavaBean风格的属性-->
<property name="name" type="string">
<column name="name" length="64" not-null="true" />
</property>

<property name="sex"
not-null="true"
update="false"/>

<!--多对一映射关系-->
<many-to-one name="friend"
column="friend_id"
update="false"/>

<!--设置关联关系-->

<set name="friends" inverse="true" order-by="id">
<key column="friend_id"/>
<!—一对多映射-->
<one-to-many class="Cat"/>
</set>
</class
</class="tags" href="/tags/HIBERNATE.html" title=hibernate>hibernate-mapping>


  组件应用的方法

   组件有两种类型,即组件(component)和动态组件(dynamic-component)。在配置文件中,component元素为子对象的元 素与父类对应表的字段建立起映射关系。然后组件可以声明它们自己的属性、组件或者集合。component元素的定义如下所示:

class="code"> <component name="propertyName" class="className" insert="true|false"
upate="true|false" access="field|property|ClassName">

<property ...../>
<many-to-one .... />
........
</component>


  在这段代码中,name是指属性名,class是类的名字,insert指的是被映射的字段是否出现在SQL的INSERT语句中,upate指出被映射的字段是否出现在SQL的UPDATE语句中,access指出访问属性的策略。

  Hiebernate的基本配置

  Hibernate的class="tags" href="/tags/ShuJuKu.html" title=数据库>数据库 连 接信息是从配置文件中加载的。Hibernate的配置文件有两种形式:一种是XML格式的文件,一种是class="tags" href="/tags/PROPERTIES.html" title=properties>properties属性文件。 class="tags" href="/tags/PROPERTIES.html" title=properties>properties形式的配置文件默认文件名是class="tags" href="/tags/HIBERNATE.html" title=hibernate>hibernate.class="tags" href="/tags/PROPERTIES.html" title=properties>properties,一个class="tags" href="/tags/PROPERTIES.html" title=properties>properties形式的配置文件内容如下所示:

class="code"> #指定 class="tags" href="/tags/ShuJuKu.html" title=数据库>数据库 使用的驱动类
class="tags" href="/tags/HIBERNATE.html" title=hibernate>hibernate.connection.driver_class = com.mysql.jdbc.Driver r

#指定 class="tags" href="/tags/ShuJuKu.html" title=数据库>数据库 连接串
class="tags" href="/tags/HIBERNATE.html" title=hibernate>hibernate.connection.url = jdbc:mysql://localhost:3306/db


#指定 class="tags" href="/tags/ShuJuKu.html" title=数据库>数据库 连接的用户名
class="tags" href="/tags/HIBERNATE.html" title=hibernate>hibernate.connection.class="tags" href="/tags/USER.html" title=user>username = class="tags" href="/tags/USER.html" title=user>user

#指定 class="tags" href="/tags/ShuJuKu.html" title=数据库>数据库 连接的密码
class="tags" href="/tags/HIBERNATE.html" title=hibernate>hibernate.connection.password = password

#指定 class="tags" href="/tags/ShuJuKu.html" title=数据库>数据库 使用的方言
class="tags" href="/tags/HIBERNATE.html" title=hibernate>hibernate.dialect = net.sf.class="tags" href="/tags/HIBERNATE.html" title=hibernate>hibernate.dialect.MySQLDialect

#指定是否打印SQL语句
class="tags" href="/tags/HIBERNATE.html" title=hibernate>hibernate.show_sql=true


  在配置文件中包含了一系列属性的配置,Hibernate将根据这些属性来连接class="tags" href="/tags/ShuJuKu.html" title=数据库>数据库 。

  在XML格式的配置文件中,除了基本的Hibernate配置信息,还可以指定具体的持久化类的映射文件,这可以避免将持久化类的配置文件硬编码在程序中。XML格式的配置文件的默认文件名为class="tags" href="/tags/HIBERNATE.html" title=hibernate>hibernate.cfg.xml,一个XML配置文件的示例如下所示:

class="code"> <?xml version='1.0' encoding='UTF-8'?>

<!DOCTYPE class="tags" href="/tags/HIBERNATE.html" title=hibernate>hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://class="tags" href="/tags/HIBERNATE.html" title=hibernate>hibernate.sourceforge.net/class="tags" href="/tags/HIBERNATE.html" title=hibernate>hibernate-configuration-3.0.dtd">

class="tags" href="/tags/HIBERNATE.html" title=hibernate>hibernate-configuration>
<session-factory>
<!--显示执行的SQL语句-->
<property name="show_sql">true</property>

<!--连接字符串-->
<property name="connection.url">jdbc:mysql://localhost:3306/STU</property>

<!--连接 class="tags" href="/tags/ShuJuKu.html" title=数据库>数据库 的用户名-->
<property name="connection.class="tags" href="/tags/USER.html" title=user>username">root</property>

<!-- class="tags" href="/tags/ShuJuKu.html" title=数据库>数据库 用户密码-->
<property name="connection.password">root</property>

<!-- class="tags" href="/tags/ShuJuKu.html" title=数据库>数据库 驱动-->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>

<!--选择使用的方言-->
<property name="dialect">org.class="tags" href="/tags/HIBERNATE.html" title=hibernate>hibernate.dialect.MySQLDialect</property>

<!--映射文件 -->
<mapping resource="com/stuman/domain/Admin.hbm.xml" />

<!--映射文件-->
<mapping resource="com/stuman/domain/Student.hbm.xml" />

</session-factory>
</class="tags" href="/tags/HIBERNATE.html" title=hibernate>hibernate-configuration>


  class="tags" href="/tags/PROPERTIES.html" title=properties>properties形式的配置文件和XML格式的配置文件可以同时使用。当同时使用两种类型的配置文件时,XML配置文件中的设置会覆盖class="tags" href="/tags/PROPERTIES.html" title=properties>properties配置文件的相同的属性。

  对象标识符号

  在关系class="tags" href="/tags/ShuJuKu.html" title=数据库>数据库 表 中,主键(Primary Key)用来识别记录,并保证每条记录的唯一性。在Java语言中,通过比较两个变量所引用对象的内存地址是否相同,或者比较两个变量引用的对象值是否相 同来判断两对象是否相等。Hibernate为了解决两者之间的不同,使用对象标识符(OID)来标识对象的唯一性。OID是关系class="tags" href="/tags/ShuJuKu.html" title=数据库>数据库 中主键在Java对象模型中的等价物。在运行时,Hibernate根据OID来维持Java对象和class="tags" href="/tags/ShuJuKu.html" title=数据库>数据库 表中记录的对应关系。如下代码所示,三次调用了Session的load()方法,分别加载OID为1或3的User对象。

class="code"> Transaction tx = session.beginTransaction();
User class="tags" href="/tags/USER.html" title=user>user1 = (User)session.load(User.class,new Long(1));
User class="tags" href="/tags/USER.html" title=user>user2 = (User)session.load(User.class,new Long(1));
User class="tags" href="/tags/USER.html" title=user>user3 = (User)session.load(User.class,new Long(3));
System.out.println( class="tags" href="/tags/USER.html" title=user>user1 == class="tags" href="/tags/USER.html" title=user>user2 );
System.out.println( class="tags" href="/tags/USER.html" title=user>user1 == class="tags" href="/tags/USER.html" title=user>user3 );


  应用程序在执行上述代码时,第一次加载OID为1的User对象,从class="tags" href="/tags/ShuJuKu.html" title=数据库>数据库 中 查找ID为1的记录,然后创建相应的User实例,并把它保存在Session缓存中,最后将该实例的引用赋值给变量class="tags" href="/tags/USER.html" title=user>user1。第二次加载OID为1的 对象时,直接把Session缓存中OID为1的实例的引用赋值给变量class="tags" href="/tags/USER.html" title=user>user2。因此,表达式class="tags" href="/tags/USER.html" title=user>user1==class="tags" href="/tags/USER.html" title=user>user2的结果为true。

  标识的生成可以使用不同的策略,表1为Hibernate内置的标识生成策略。

  表1 Hibernate标识生成策略

class="MsoNormalTable" style="border: medium none; border-collapse: collapse;" border="1" cellspacing="0" cellpadding="0">
标识符生成器
描述
increment适用于代理主键。由Hibernate自动以递增方式生成。
identity适用于代理主键。由底层class="tags" href="/tags/ShuJuKu.html" title=数据库>数据库 生成标识符。
sequence适用于代理主键。Hibernate根据底层class="tags" href="/tags/ShuJuKu.html" title=数据库>数据库 的序列生成标识符,这要求底层class="tags" href="/tags/ShuJuKu.html" title=数据库>数据库 支持序列。
hilo适用于代理主键。Hibernate分局high/low算法生成标识符。
seqhilo适用于代理主键。使用一个高/低位算法来高效的生成long,short或者int类型的标识符。
native适用于代理主键。根据底层class="tags" href="/tags/ShuJuKu.html" title=数据库>数据库 对自动生成标识符的方式,自动选择identity、sequence或hilo。
uuid.hex适用于代理主键。Hibernate采用128位的UUID算法生成标识符。

uuid.string
适用于代理主键。UUID被编码成一个16字符长的字符串。
assigned适用于自然主键。由Java应用程序负责生成标识符。
foreign适用于代理主键。使用另外一个相关联的对象的标识符。

  Hibernate映射类型

  在对象/关系映射文件中,Hibernate采用映射类型作为Java类型和SQL类型的桥梁。Hibernate映射类型分为2种:内置映射类型和自定义映射类型。

  1、内置映射类型

  Hibernate对所有的Java原生类型、常用的Java类型如String、Date等都定义了内置的映射类型。表2列出了Hibernate映射类型、对应的Java类型以及对应的标准SQL类型。

  表2 Hibernate内置映射类型

class="MsoNormalTable" style="border: medium none; border-collapse: collapse;" border="1" cellspacing="0" cellpadding="0">
Hibernate映射类型Java类型标准SQL类型大小
integer/intclass="tags" href="/tags/JAVA.html" title=java>java.lang.Integer/intINTEGER4字节
longclass="tags" href="/tags/JAVA.html" title=java>java.lang.Long/longBIGINT8字节
shortclass="tags" href="/tags/JAVA.html" title=java>java.lang.Short/shortSMALLINT2字节
byteclass="tags" href="/tags/JAVA.html" title=java>java.lang.Byte/byteTINYINT1字节
floatclass="tags" href="/tags/JAVA.html" title=java>java.lang.Float/floatFLOAT4字节
doubleclass="tags" href="/tags/JAVA.html" title=java>java.lang.Double/doubleDOUBLE8字节
big_decimalclass="tags" href="/tags/JAVA.html" title=java>java.math.BigDecimalNUMERIC 
characterclass="tags" href="/tags/JAVA.html" title=java>java.lang.Character/class="tags" href="/tags/JAVA.html" title=java>java.lang.String/charCHAR(1)定长字符
stringclass="tags" href="/tags/JAVA.html" title=java>java.lang.StringVARCHAR变长字符
boolean/ yes_no/true_falseclass="tags" href="/tags/JAVA.html" title=java>java.lang.Boolean/BooleanBIT布尔类型
dateclass="tags" href="/tags/JAVA.html" title=java>java.util.Date/class="tags" href="/tags/JAVA.html" title=java>java.sql.DateDATE日期
timestampclass="tags" href="/tags/JAVA.html" title=java>java.util.Date/class="tags" href="/tags/JAVA.html" title=java>java.util.TimestampTIMESTAMP日期
calendarclass="tags" href="/tags/JAVA.html" title=java>java.util.CalendarTIMESTAMP日期
calendar_dateclass="tags" href="/tags/JAVA.html" title=java>java.util.CalendarDATE日期
binarybyte[]BLOB
BLOB
textclass="tags" href="/tags/JAVA.html" title=java>java.lang.StringTEXTCLOB
serializable实现class="tags" href="/tags/JAVA.html" title=java>java.io.Serializablej接口的任意Java类BLOBBLOB
clobclass="tags" href="/tags/JAVA.html" title=java>java.sql.ClobCLOBCLOB
blobclass="tags" href="/tags/JAVA.html" title=java>java.sql.BlobBLOBBLOB
classclass="tags" href="/tags/JAVA.html" title=java>java.lang.ClassVARCHAR定长字符
localeclass="tags" href="/tags/JAVA.html" title=java>java.util.LocaleVARCHAR定长字符
timezoneclass="tags" href="/tags/JAVA.html" title=java>java.util.TimeZoneVARCHAR定长字符
currencyclass="tags" href="/tags/JAVA.html" title=java>java.util.CurrencyVARCHAR定长字符


  2、自定义映射类型

   Hibernate提供了自定义映射类型接口,允许用户以编程的方式创建自定义的映射类型。用户自定义的映射类型需要实现 net.sf.class="tags" href="/tags/HIBERNATE.html" title=hibernate>hibernate.UserType或net.sf.class="tags" href="/tags/HIBERNATE.html" title=hibernate>hibernate.CompositeUserType接口。具体的创建自定义映 射类型的方法请参考class="tags" href="/tags/HIBERNATE.html" title=hibernate>hibernate官方文档或相关资料,这里不再详细介绍。


http://www.niftyadmin.cn/n/527723.html

相关文章

在hibernate中实现oracle的自动增长(转)

在hibernate中实现oracle的自动增长 关键字: hibernate oracle sequence native 根据hibernate的文档,有两种方式实现实体对象的主键自动增长。 第一种:设置ID的增长策略是sequence,同时指定sequence的名字,最好每个表建一个seque…

ORACLE函数大全

ORACLE函数大全(整理转帖修改) SQL中的单记录函数1.ASCII返回与指定的字符对应的十进制数;SQL> select ascii(A) A,ascii(a) a,ascii(0) zero,ascii( ) space from dual; A A ZERO SPACE--------- --------- --------- ---------65 97 48 322.CHR给出整数,返回对应的字符;SQ…

更改windows背景颜色

用眼专家推荐一项保护眼睛的做法: 电脑设置: 桌面->单击右键->属性->外观->高级->项目(选择“窗口”)、颜色1(L)(选择“其它”)->在 弹出…

在was6.1和was6.0下删除概要文件

在was6.1下删除概要文件 列出概要文件 D:/IBM/WebSphere/AppServer/profiles/AppSrv01/bin>manageprofiles.bat -listProfiles [AppSrv01, AppSrv02] 删除AppSrv01 D:/IBM/WebSphere/AppServer/profiles/AppSrv01/bin>manageprofiles.bat -delete -pro filesName Ap…

调出Pl/Sql Developer window list窗口

当我们平时不小心关掉了 window list 菜单后很麻烦,就要把所有的窗口都还原了才能进行切换,并且还没有快捷键。 在这我用文字和图形共同来描述下怎么能把 window list 菜单给调出来。 文字方式描述如下: 有两步操作 &#xff08…

AS3.0:调用SWF文件

AS3.0和AS2.0有了很多变化,以下是“AS3.0:调用SWF文件”的一个例子(其中yanshi是一个按钮): yanshi.addEventListener("click",play_child); function play_child(evt:MouseEvent){ var request:URLReques…

as3 监听函数传递参数

as3中的addEventListener事件监听会自动传递一个事件对象参数给处理函数,可是不能传递其他参数. 如果要为事件处理函数送参数的话可以用这种方法: 见代码: 执行结果输出11 package { import flash.events.MouseEvent; public class aa { public static var X:Number11; …

Flash AS3.0 actionscript全屏播放代码

my_btn.addEventListener(MouseEvent.CLICK,fs);//监听事件 function fs(evt:MouseEvent):void { switch (stage.displayState) { case "normal" : stage.displayState"fullScreen"; break; case "fullScreen" : default : stage.displayS…