Hibernate映射的基本操作

    xiaoxiao2026-08-23  2

    转:http://www.cnblogs.com/JemBai/archive/2011/03/29/1999033.html

    Hibernate映射主要是通过对象关系映射文件实现,对象关系映射文件把数据库中的实体(一般为二维表)映射到面向对象中的实体对象,把数据库中多个表之间的相互关系也反映到映射好的类中。以后,在Hibernate中对数据库的操作就直接转换为对这些实体对象的操作了。

    1.    映射文件说明: 正确理解各个配置选项的含义是掌握映射文件的关键。映射文件可以对面向对象中的关联关系、继承关系和组合关系等各种关系进行配置。如: <!-- XML 文件的声明  --> <? xml  version = "1.0"  encoding = "utf-8" ?> <!-- hibernate DTD 文件的声明  --> <! DOCTYPE  hibernate-mapping  PUBLIC          "-//Hibernate/Hibernate Mapping DTD 3.0//EN"          "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" > <!--  映射文件的根节点  --> < hibernate-mapping > <!-- 对象关系映射的开始: class 元素表示类和数据库中的表的映射关系。 name 属性指定持久化类(或者接口)的 Java 全限定名; table 属性指定要映射的对应的数据库表名  -->      < class  name = "org.qiujy.bean.User"  table = "user" >      <!-- 持久化类对象的对象标识符 (OID) 和表的主键的映射关联: name 属性指定类中作为 OID 的属性名; column 属性表中主键字段的名字; type 属性指定 Hibernate 的映射类型       -->          < id  name = "id"  column = "id"  type = "int" >               <!--  指定对象标识符生成器: class 属性指定生成器的类别名  -->              < generator  class = "native" />          </ id >          <!-- 普通属性的映射: name 属性:属性的名字 , 以小写字母开头; column 属性:对应的数据库字段名 type 属性: 指定 Hibernate 的映射类型 -->          < property  name = "name"  column = "name"  type = "string" />          < property  name = "age"  column = "age"  type = "int" />      </ class > </ hibernate-mapping >   2.    Hibernate映射类型: 在对象-关系映射文件中,Hibernate映射类型作为Java类型和SQL类型的桥梁。在映射文件中建议使用Hibernate映射类型。 2.1.         java基本映射类型的Hibernate映射类型: Java类型、Hibernate映射类型以及SQL类型之间的对应关系: Java类型 Hibernate映射类型 标准SQL类型 int或java.lang.Integer integer或int INTEGER long或java.lang.Long long BIGINT short或java.lang.Short short SMALLINT byte或java.lang.Byte byte TINYINT float或java.lang.Float float FLOAT double或java.lang.Double double DOUBLE java.math.BigDecimal big_decimal NUMERIC char或java.lang.Character character CHAR(1) java.lang.String string VARCHAR boolean或java.lang.Boolean boolean BIT boolean或java.lang.Boolean yes_no CHAR(1)('Y'或' N') boolean或java.lang.Boolean true_false CHAR(1)('T'或' F')   2.2.         java时间和日期类型的Hibernate映射类型: Java类型 Hibernate映射类型 标准SQL类型 说明 java.util.Date或java.sql.Date date DATE 日期 java.util.Date或java.sql.Time time TIME 时间 java.util.Date或java.sql.Timestamp timestamp TIMESTAMP 时间戳 java.util.Calendar calendar TIMESTAMP   java.util.Calendar calendar_date DATE     2.3.         java大对象类型的Hibernate映射类型: Java类型 Hibernate映射类型 标准SQL类型 MySQL类型 Oracle类型 byte[] binary VARBINARY( 或者 BLOB) BLOB BLOB java.lang.String text CLOB TEXT CLOB 实现 java.io.Serializable 接口的任意一个 java serializable VARBINARY( 或者 BLOB) BLOB BLOB java.sql.Clob clob CLOB TEXT CLOB java.sql.Blob blob BLOB BLOB BLOB   3.    映射对象标识符(OID) Hibernate中使用对象标识符(OID)来惟一标识一个对象。为了应付多变的业务要求,Hibernate制定了多种主键生成器。在hibernate的映射文件中,可以指定主键的生成器,如: < id  name = "id"  column = "id"  type = "int" >      < generator  class = "native" /> </ id > Hibernate提供的几种内置标识符生成器: 标识符生成器 描述 increment: 由hibernate自动以递增的方式生成标识符,每次增量为1.适用于代理主键identity: 由底层数据库生成标识符.数据库必须支持自动增长字段类型,不便于不同数据库之间的移植.适用于代理主键sequenceHibernate根据底层数据库序列来生成标识符.前提是条件是底层数据库支持序列(如Oracle).适用于代理主键hiloHibernate根据high/how算法来生成标识符.适用于代理主键seqhilo: 使用一个高/低位算法来高效的生成longshort 或者 int类型的标识符,给定一个数据库序列(sequence)的名字.适用于代理主键. native: 根据底层数据库对自动生成标识符的支持能力,来选择identity,sequence或hilo.适用于代理主键. uuid.hexHibernate采用128位的UUID(Universal Unique Identification)算法来生成标识符.UUID算法能够在网络环境中生成唯一的字符串标识符.但字符串型的主键比整型的主键占用更多的数据库空间.适用于代理主键uuid.string使用UUID算法来生成标识符.UUID被编码为一个16个字符长的任意ASCII组成的字符串。适用于代理主键assigned: 由Java应用程序负责生成标识符,需在保存数据前完成.适用于自然主键4.    映射自然主键: 代理主键是指与业务逻辑没有联系的主键,而自然主键指与业务逻辑相关的主键。 Hibernate中推荐使用代理主键,而应该尽量不使用自然主键,因为自然主键与业务逻辑联系紧密,一旦自然主键的需求发生变化,与之相关的程序就要变化。自然主键在遗留的旧系统中仍然大量的存在。 如:某人设计的学生表中没有定义代理主键ID,而是以学号(no)字段作为主键,那么相应的学生类中不必定义属性ID,而是以no属性作为OID。映射文件为: …… < id  name = "no"  column = "no"  type = "int" >      <!--  指定主键生成方式为 Assigned -->      < generator  class = "assigned" /> </ id > …… 也就是说由程序负责给主键赋值。 5.    映射复合自然主键: 如某人设计的学生表中没有定义代理主键ID,而是以姓(firstname)字段和名(lastname)字段作为复合主键,那么相应的学生类中不必定义属性ID。而是以firstName属性和lastName作为OID,它的映射代码如下: …… <composite- id> <key-property  name = "firstName"  column = "firstname"  type = "string" >       < key-property  name = "lastName"  column = "lastname"  type = "string" > </composite- id > …… 注意:此时的student类因为带有复合的OID,这个类必须实现java.io.Serializable接口,用firstName和lastName这两个属性重写equals()和hashcode()方法。 还有一种方式是先定义单独的主键类,然后在Student类中定义该主键类的一个属性。在此不再赘述。 转载地址: http://blog.csdn.net/qjyong/archive/2007/10/17/1829672.aspx

    转载请注明原文地址: https://ju.6miu.com/read-1311470.html
    最新回复(0)