版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、深入浅出 Hibernate4 开发1第一部分 Hibernate4 入门一、Hibernate 是什么1.Hibernate 是什么Hibernate 是一个轻量级的 ORMap框架。2.ORMap原理(Objecational Map)3.ORMap的基本对应规则1:类跟表相对应2:类的属性跟表的字段相对应3:类的实例与表中具体的一条相对应4:一个类可以对应多个表,一个表也可以对应多个类5:DB 中的表可以没有主键,但是Object 中必须设置主键字段6:DB 中表与表之间的关系(如:外键)成为 Object 之间的关系7:Object 中属性的个数和名称可以和表中定义的字段个数和名称不一
2、样24. ORMap的实现方式使用 JDBC,用 SQL 来操作数据库,只是看动态生成还是人工写代码来实现。大家想想,实现过 ORMap吗?二、Hibernate 能干什么1. Hibernate 能干什么Hibernate 主要用来实现 Java 对象和表之间的,除此之外还提供还提供数据查询和3获取数据的方法,可以大幅度减少开发时人工使用 SQL 和 JDBC 处理数据的时间。Hibernate的目标是对于开发者通常的数据持久化相关的编程任务,解放其中的 95%。对于以数据为中心的程序来说,它们往往只在数据库中使用过程来实现商业逻辑,Hibernate 可能不是最好的解决方案;对于那些在基于
3、 Java 的中间层应用中,它们实现面象的业务模型和商业逻辑的应用,Hibernate 是最有用的。Hibernate 可以帮助你消除或者包装那些针对特定厂商的 SQL 代码,并且帮你把结果集从表格式的表示形式转换到一系列的对象去。4三、Hibernate1.Hibernate 体系结构52. Hibernate 运行时体系结构“最小”的体系结构方案,要求应用程序提供自己的 JDBC连接并管理自己的事务。这种方案使用了 Hibernate API的最小子集.3.“全面解决”的体系结构方案将应用层从底层的 JDBC/JTA API 中抽象出来,而让Hibernate 来处理这些细节64. Ses
4、Factoryhibernate.SesFactory, 针对单个数据库关系经过编译后的内存镜像,是线程安全的(不可变)。它是生成 Ses的工厂,本身要用到 ConnectionProvider。5. Seshibernate.Ses,表示应用程序与持久层之间交互操作的一个单线程对象,此对象生存期很短,隐藏了 JDBC 连接,也是 Tranion 的工厂。6. Tranionhibernate.Tranion,应用程序用来指定原子操作单元范围的对象,它是单线程的,生命周期很短。它通过抽象将应用从底层具体的 JDBC、JTA 以及 CORBA 事务开。7. ConnectionProviderh
5、ibernate.connection.ConnectionProvider,生成 JDBC 连接的工厂(有连接池的作用)。它通过抽象将应用从底层的 Datasource 或 DriverManager开。开发者扩展/实现用,并不给应用程序使用。8. TranionFactoryhibernate.TranionFactory,生成 Tranion 对象实例的工厂。开发者扩展/实现用,并不给应用程序使用。四、Hibernate 的o World1. 创建数据库Create database hibernate;Use hibernate;Create table student(idprima
6、ry key auto_increment, name varchar(25) not null, age7);Create table admin(idprimary key auto_increment, name varchar(25) not null, age);2. 创建域对象1)Student.java编写 hbm.xmlStudent.hbm.xml8public class Student privaong id; private String name; privateeger age;public Long getId() return id; public void s
7、etId(Long id) this.id = id; public String getName() return name;public void setName(String name) = name; publiceger getAge() return age; public void setAge(eger age) this.age = age; 其中的:要想提示, 需要在 Eclipse 中关联这个文件, hibernate-map-3.0.dtd可以在hibernate 发布的包中搜索到,然后在 Eclipse 中,preference-xml-category 添加:如下图
8、:2)Admin.java使用 AnnoionAdmin.java9Entity Table(name=admin) public class Admin privaong id;private String name;privateeger age;其中Entity表示该对象是对应与数据库中的表,是实体对象Table(name=admin) 表示对应于数据库中的admin表Id放在get方法上面,表示是主键GeneratedValue() ID 自增3编写 hibernate.cfg.xml 文件关于这个文件,可以在开档中国找到例子,当然你也可以查看解压后 projects/etc目录下的
9、hibernate.cfg.xml 文件。另外,您还需要参见 hibernate-configuration-3.0.dtd, 可以利用 windows 的搜索功能找到这个文件,然后关联到 Eclipse 中让其能够提示。10Id GeneratedValue()public Long getId() return id; public void setId(Long id) this.id = id; public String getName() return name;public void setName(String name) = name;publiceger getAge()
10、return age; public void setAge(eger age) this.age = age;Hibernate.cfg.xml11!-com.jdbc.Driverjdbc:/:3306/hibernaterootadmin.hibernate.dialect.Dialecttrue在上面也看到了:这个是以两种方式加载这个配置, Hibernate 需要通过这个配置来对实体类进行反射以及相关的操作。数据库配置:12.hibernate.dialect.Dialectcom.jdbc.Driverjdbc:/:3306/hibernate!- 1 -!- thread -.h
11、ibernate.cache.ernal.NoCacheProvider式来配置这些项:当然也可以通过另使用 perties 文件:将此文件置于 classpath 的根目录下。4编写测试用例1)HeUtil.java本类是一个单例对象,专门用于产生 sesfactory, 由于 SesFactory 对象很大,要加载 hibernate 相关的配置文件,因此只需要在系统启动的时候创建一份实例就行了。13public class HibernateUtil private sic final SesFactory sesFactory = buildSesFactory();/*build t
12、he sesfactory with the hibernate.cfg.xmlreturn*/private sic SesFactory buildSesFactory() try / Create the SesFactory from hibernate.cfg.xml Configuration cfg = new Configuration();/ This is nesary, no setting of dialect will be warnedhibernate.dialect.hibernate.dialect.Dialect hibernate.connection.d
13、river_class com.jdbc.Driver hibernate.connection.url jdbc:/:3306/hibernate hibernate.connection.username roothibernate.connection.password adminrootadmin2)测试实例14public class AllTests Testpublic void testSave() Student student = new Student(); student.setId(1L);student.setName(); student.setAge(22);S
14、esFactory sf =HibernateUtil.getSesFactory(); Sesses= sf.openSes();cfg.configure();ServiceRegistry sr = new ServiceRegistryBuilder().applySettings( cfg.getProperties().buildServiceRegistry();SesFactory sf = cfg.buildSesFactory(sr);return sf; catch (Throwable ex) System.err.prln(Initial SesFactory cre
15、ation failed! + ex);throw new ExceptionInInitializerError(ex);public synchronized sic SesFactory getSesFactory() return sesFactory;5运试实例点击运行 Junit 测试实例,如果没抛异常就行了。项目的目录结构如下:15ses.begranion(); ses.save(student);ses.getTranion().commit();第二部分 Hibernate 的基本配置一、可编程方式配置1. 在 java 代码中配置不如果在配置 cfg.xml 的时候,不想
16、在里面配置 hbm.xml 怎么办呢?可在程序里使用可编程的配置方式,也就是使用程序来指定在 cfg.xml 里面的配置信息,不这种方式。如下:Configuration cfg= new Configuration().addResource(Item hbm.xml).addResource(Bid hbm.xml);一个替代方法(有时是更好选择)是,指定被的类,让 Hibernate 帮你寻找定义文件:Configuration cfg= new Configuration().addClass(hibernate.auction.Item.class).addClass(hiberna
17、te.auction.Bid.class);这种方式消除了任何对文件名的硬编码。还可以通过编程的方式来指定配置属性:Configuration cfg = new Configuration().addClass(hibernate.auction.Item.class).setProperty(hibernate.dialect,.hibernate.dialect.InnoDBDialect).setProperty(hibernate.connection.datasource, p/env/jdbc/test).setProperty(hibernate.order_updates,
18、true);2. 其他可以传入配置属性的方式1:properties 文件2:xml 文件3:设置 Java 的系统属性,形如:java Dproperty=value163. 另外要注意一点hibernate.cfg.Configuration 实例被设计成启动期间( startup-time )对象,一旦SesFactory 创建完成它就被丢弃了。.cfg.xml-与数据库二、1. Hibernate 与数据库连接的方式(1)JDBC示例:17com.jdbc.Driverjdbc:/localhost:3306/hibernaterootadmin1属性用途hibernate.conne
19、ction.driver_classJDBC 驱动hibernate.connection.urlJDBC URLhibernate.connection.username数据库用户hibernate.connection.password数据库用户hibernate.connection.pool_size连接池容量上限数目(2)DataSource示例:java:/javassDs2. 连接池 c3p0 配置由于 Hibernate 自己实现的连接池不太好,在项目中,建议使用工业级的连接池,比如:c3p0,Hibernate包中带有 c3p0,下面就是其基本配置示例:oracle.jdbc
20、.driver.OracleDriverjdbc:oracle:thin:localhost:1521:orcljavassjavass52018050183.cfg.xml-可选配置194. 数据库的 catalog 和 schema,引入 catalog 和 schema 来解决。从概念上说,为了解决数据库中元素命名一个数据库系统包含多个 Catalog,每个 Catalog 又包含多个 Schema,而每个 Schema 又包含多个数据库对象(表、视图、字段等)。比较简单而常用的实现方式是使用数据库名作为 Catalog 名,使用用户名作为 Schema名,各种数据库系统对 Catalo
21、g 和 Schema 的支持具体可参见下表:205.cfg.xml-JDBC 连接属性216.cfg.xml-缓存属性227.cfg.xml-事务属性238.cfg.xml-事务策略(1)为了让应用在 JDBC 事务和 JTA 事务环境中可以移植,建议使用可选的 HibernateTranion API, 它包装并隐藏了底层系统。(2)通过设置 Hibernate 配置属性 hibernate.tranion.factory_class 来指定一个 Tranion实例的工厂类。(3)有三个标准(内建)的选择1)委托给数据库(JDBC)事务(默认)Hibernate4 以前:.hibernate
22、.tranion.JDBCTranionFactoryHibernate4 里面:.hibernate.engine.tranion.ernal.jdbc.JDBCTranionFactory2)JTA 事务,如果在上下文环境中存在运行着的事务(如, EJB 会话 Bean 的方法),则委托给容器管理的事务,否则,将启动一个新的事务,并使用 Bean 管理的事务。Hibernate4 以前:hibernate.tranion.JranionFactoryHibernate4 里面:hibernate.engine.tranion.ernal.jta.JranionFactory3)委托给容器管
23、理的 JTA 事务Hibernate4 以前:hibernate.tranion.CMTTranionFactoryHibernate4 里面:.hibernate.engine.tranion.ernal.jta.CMTTranionFactory也可以定义属于你自己的事务策略(如,针对CORBA 的事务服务)249.cfg.xml-其他属性2510.cfg.xml-方言方言可以在 Hibernate 提供的文档中找到,不用可以去,即便你记住了,也不代表你是有多牛。2611.cfg.xml-日志(1)Hibernate 使用 SLF4J 来做日志,可以根据你选择的绑定把日志输出到日志框架(N
24、OP、Simple、log4j ver1.2、JDK 1.4 logging、JCL 或 logback)上。(2)需要在 classpath 里加入 slf4j-api.jar 和你选择的绑定的 JAR文件(使用 Log4J时加入 slf4j-log4j12.jar),当然别忘了加入 log4j 自己的 jar 包。(3)Hibernate 日志类别.hbm.xml 配置三、1. Hibernate-map元素这个元素是hbm.xml 配置的根元素,定义如下:27schema(可选)数据库 schema 的名称,表名会加上所指定的 schema 的名字扩展为表的全限定名。Catalog(可选
25、)数据库 catalog 的名称,表名会加上所指定的 catalog 的名字扩展为表的全限定名。default-cascade (可选-默认为 none)默认的级联风格。指定了未明确注明 cascade 属性的 Java 属性和集合类,Hibernate 会采取什么样的默认级联风格。auto-import 属性默认让在查询语言中可以使用非全限定名的类名。default-acs (可选-默认为 property)Hibernate 用来所有属性的策略。可以通过实现PropertyAcsor 接口自定义。default-lazy(可选- 默认为 true)指定了未明确注明 lazy 属性的 Jav
26、a 属性和集合类,Hibernate 会采取什么样的默认加载风格。auto-import (可选-默认为 true)指定是否可以在查询语言中使用非全限定的类名(仅限于本文件中的类)。package (可选)指定一个包前缀,如果在文档中没有指定全限定的类名,就使用这个作为包名。假若你有两个持久化类,它们的非全限定名是一样的(就是两个类的名字一样,所在的包不一样),你应该设置 auto-import=false。如果你把一个“import 过”的名字同时对应两个类,Hibernate 会抛出一个异常。282. Lazy 和 1+N 次查询1+N 次查询如果设置了装载策略为 lazy,那么可能会带来
27、有名的 1+N 次查询,1+N 有两种典型的体现,一个是以 Iterator 为代表,一个是以关系为代表。以 Iterator 为代表的 1+N 次查询1:第一次查询的时候:如果是设置了lazy 的对象,Hibernate 会只装载主键的值2:那么以后每次真正调用一个对象的时候,Hibernate 发现这个对象没有值,只有主键,那么 Hibernate 会用主键做条件重新查询一次。3:设若 N 条后来都了,那么总的查询次数就是 1+N 次以关系为代表的 1+N 次查询1:第一次查询出有N 条 Parent 对象2:当每个 Parent 对象里面的 Child 对象或 Child 对象集合的时候
28、,会重新用一条sql 去Child 对象。3:设若 N 条 Parent 对象都了里面的 Child,那么总的查询次数就是 1+N 次3. Class 元素元素使用 class 元素来定义一个持久化类:name (可选):持久化类(或者接口)的 Java 全限定名。如果这个属性不存在,Hibernate 将假定这是一个非 POJO 的实体。若指明的持久化类实际上是一个接口,这也是可以的,可以用元素来指定该接口的实际实现类。table (可选-默认是类的非全限定名)对应的数据库表名。discriminator-value (可选- 默认和类名一样)一个用于区分不同的子类的值,在多态行为时使用。它
29、可以接受的值包括 null 和not null30mutable (可选,默认值为 true)表明该类的实例是可变的或者不可变的。不可变类,mutable=false不可以被应用程序更新或者删除。schema (optional)覆盖在根元素中指定的 schema。catalog (optional)覆盖在根元素中指定的 xy (可选)指定一个接口,在延迟装载时作为使用。可选的 proxy 属性允许延迟加载类的持久化实例。Hibernate 开始会返回实现了这个命名接口的 CGLIB。当的某个方法被实际调用的时候,真实的持久化对象才会被装载。dynamic-update
30、(可选, 默认为 false)指定用于 UPDATE 的 SQL 将会在运行时动态生成,并且只更新那些改变过的字段。dynamic-insert (可选, 默认为 false)。指定用于 INSERT 的 SQL 将会在运行时动态生成,并且只包含那些非空值字段select-before-update (可选, 默认为 false)。指定 Hibernate 除非确定对象真正被修改了,否则不会执行 SQL UPDATE 操作。在特定场合(实际上,它只在一个瞬时对象(transient object)关联到一个新的 ses中时执行的update()中生效),这说明 Hibernate 会在 UPD
31、ATE 之前执行一次额外的 SQL SELECT 操作,来决定是否应该执行 UPDATE。使用 select-before-update 通常会降低性能。31polymorphism(多态)(可选, 默认值为 implicit (隐式) )界定是隐式还是显式的使用多态查询,这只在 Hibernate 的具体表继承策略中用到。Implicit 隐式多态是指:如果查询时给出的是任何超类、该类实现的接口或者该类的名字,都会返回这个类的实例;如果查询中给出的是子类的名字,则会返回子类的实例。 Explicit显式多态是指:只有在查询时给出明确的该类名字时才会返回这个类的实例;同时只有在这个的定义中作为
32、 或者出现的子类,才可能被返回。在大多数情况下,默认的 polymorphism=implicit都是合适的。where (可选)指定一个附加的 SQLWHERE 条件,在抓取这个类的对象时会一直增加这个条件。persister(可选)指定一个定制的 Class Persister。batch-size (可选,默认是 1)指定一个用于根据标识符(identifier)抓取实例时使用的“batch size”(批次抓取数量)optimistic-lock(乐观锁定)(可选,默认 ver)。决定乐观锁定的策略。如果你打开了 dynamic-update,你可以选择几种乐观锁定的策略:1)ver(
33、版本检查)检查ver/timest字段2)all(全部)检查全部字段3)dirty(脏检查)只修改过的字段4)none(查)不使用乐观锁定非常强烈建议你在 Hibernate 中使用 ver/timest字段来进行乐观锁定。对性能来说,这是最好的选择,并且这也是唯一能够处理在 ses行操作的策略。32lazy (可选)延迟加载(Lazy fetching)。entity-name (可选,默认为类名)Hibernate4 允许一个类进行多次(前提是到不同的表),并且允许使用 Maps或 XML 代替 Java 层次的实体(也就是实现动态领域模型,不用写持久化类)。check (可选)这是一个
34、SQL 表达式,用于为自动生成的 schema 添加多行约束检查。rowid(可选)Hibernate 可以使用数据库支持的所谓的 ROWIDs,例如:Oracle 数据库,如果你设置这个可选的 rowid,Hibernate 可以使用额外的字段 rowid 实现快速更新。subselect(可选)它将一个不可变(immutable)并且只读的实体到一个数据库的子查询中。当你想用视图代替一张基本表的时候,这是有用的,但最好不要这样做。abstract (可选)用于在的继承结构中标识抽象超类4. 多次一个类如果想要多次同一个类,可以采用如下的方式:对特定的持久化类,多次是允许的。这种情形下,你必
35、须指定 entity name 来区别同实体的对象实例。默认情况下,实体名字和类名是相同的。Hibernate 在操作持久化对象、编写查询条件,或者把关联到指定实体时,允许你指定这个 entity name(实体名字)。335. Ver元素配置元素 元素是可选的,表明表中包含附带版本信息的数据。column(可选默认为属性名)指定持有版本号的字段名。name持久化类的属性名。type(可选默认是eger)版本号的类型。acs(可选默认为 property)Hibernate 用来属性值的策略。unsaved-value(可选默认是 undefined)用于标明某个实例是刚刚被实例化的(尚未保存
36、)版本属性值,依靠这个值就可以把这34种情况和已经在先前的 ses中保存或装载的脱管(detached)实例区分开来。(undefined指明应被使用的标识属性值。)generated(可选默认是 never)表明此版本属性值是否实际上是由数据库生成的。insert(可选默认是 true)表明此版本列应该包含在 SQL语句中。只有当数据库字段有默认值 0 的时候,才可以设置为 false。6. 乐观锁(1)首先在数据库表中添加一个字段:ver,类型为number(2)在 UserM里面添加一个字段:ver,类型为,也要对应的 getter 和 setter 方法。(3)在 UserMhbm.x
37、ml 中添加配置如下:35(4)然后把数据库tbl_user 中的数据全部清除掉,这样好观察数据变化(5)运行原来的 cnt,在数据库中生成一条数据,值是:uuid=1,userId=id1,name=name1,age=1,ver=0(6)注意:ver字段为 Hibernate 自己,程序中不需要操作这个字段(7)然后写新的客户端进试,如下:36import.hibernate.Ses;import.hibernate.SesFactory; import.hibernate.Tranion; import.hibernate.cfg.Configuration; public class
38、C nt public s ic void main(String args) SesFactory sf= new Configuration().configure().buildSesFactory(); Sesses1 = null;Sesses2 = null; try/ 有使用者 1 开启了一个 ses1ses1 = sf.openSes();/ 在这之后,马上有另一个使用者 2 开启了 ses2 ses2 = sf.openSes();/ 使用者 1 查询数据UserMuserV1 = (UserM) ses1.load(UserM.class, 1);/ 使用者 2 查询同一条
39、数据UserMuserV2 = (UserM) ses2.load(UserM.class, 1);/ 此时两个版本号是相同的System.out.prln(v1=+ userV1.getVer() + ,v2=+ userV2.getVer(); Tranion tx1 = ses1.begranion();Tranion tx2 = ses2.begranion();/ 使用者 1 更新数据userV1.setAge(111); mit();/ 此时由于数据更新,数据库中的版本号递增了/ 两笔数据版本号不一样了System.out.prln(v1=+userV1.getVer()+,v2=
40、+ userV2.getVer();/ userV2 的 age 数据还是旧的/ 数据更新userV2.setName(vertest);/ 因版本号比数据库中的旧/ 修改会失败,抛出 StableObjectS eException 例外mit(); catch(Exception err ) err.prStackTrace();7. Id 元素被的类必须定义对应数据库表主键字段。大多数类有一个 JavaBeans 风格的属性,为每一个实例包含唯一的标识。 元素定义了该属性到数据库表主键字段的。 (5)name (可选)标识属性的名字。type (可选)标识 Hibernate 类型的名字
41、。column (可选-默认为属性名)主键字段的名字。unsaved-value (可选-默认为一个切合实际(sensible)的值)一个特定的标识属性值,用来标志该实例是刚刚创建的,尚未保存。unsaved-value属性在 Hibernate4 中几乎不再需要。37 finally ses1.close();ses2.close();acs (可选-默认为 property)Hibernate 用来属性值得策略。8. Hibernate 的类型Hibernate 在进行的时候,既不使用 Java 的类型,也不使用数据库的类型,而是使用自己提供的类型,Hibernate 提供大量的内建类型,
42、也支持自定义类型。(1)Hibernate 的内建类型内置的 basic maptypes 可以大致地分类为:1) eger, long, short, float, double, character, byte, yes_no, true_false这些类型都对应 Java 的原始类型或其封装类,来符合特定厂商的 SQL 字段类型。2),yes_no 和 true_false是 Java 中或者的另外说法。3)string从 java.lang.String 到 VARCHAR(或者 Oracle 的 VARCHAR2)的。4)date, time, timest从 java.util.D
43、ate 和其子类到 SQL 类型 DATE,TIME 和 TIMEST(或等价类型)的。5)calendar, calendar_date从 java.util.Calendar 到 SQL 类型 TIMEST和 DATE(或等价类型)的。6)big_decimal, big_eger从java.math.BigDecimal 和java.math.Bigeger 到NUMERIC(或者 Oracle 的NUMBER类型)的。7)locale, timezone, currency从java.util.Locale,java.util.TimeZone 和java.util.Currency
44、到VARCHAR(或者Oracle 的VARCHAR2 类型)的。Locale 和 Currency 的实例被为它们的 ISO 代码。TimeZone 的实例被影射为它的 ID。8)class从 java.lang.Class 到 VARCHAR(或者 Oracle 的 VARCHAR2 类型)的。Class 被38为它的全限定名。9)binary把字节数组(byte arrays)为对应的 SQL 二进制类型。10)text把长 Java 字符串为 SQL 的 CLOB 或者 TEXT 类型。11)serializable把可序列化的 Java 类型到对应的 SQL 二进制类型。你也可以为一
45、个并非默认为基本类型的可序列化 Java 类或者接口指定 Hibernate 类型serializable。12)clob, blobJDBC 类 java.sql.Clob 和 java.sql.Blob 的。某些程序可能不适合使用这个类型,因为 blob 和 clob 对象可能在一个事务之外是无法重用的。(而且, 驱动程序对这种类型的支持充满着补丁和前后。)13)imm_date, imm_time, imm_timest, imm_calendar, imm_calendar_date, imm_serializable,imm_binary一般来说,类型被假定为是可变的 Java 类型
46、,只有对不可变 Java 类型,Hibernate会采取特定的优化措施,应用程序会把这些对象作为不可变对象处理。比如,你不应该对作为 imm_timest的 Date 执行 Date.setTime()。要改变属性的值,并且保存这一改变,应用程序必须对这一属性重新设置一个新的(不一样的)对象。在.hibernate.Hibernate中,定义了基础类型对应的 Type 常量。比如,Hibernate.STRING 代表string 类型。9. comite-id 元素如果表使用联合主键,你可以类的多个属性为标识符属性。这种做法现在是非常不的,但可能有些遗留系统使用了双主键或多主键。配置如下示例
47、:就表示是一个双主键,由 name 和deptment 联合来做主键使用Comite-id 元素的时候,39你的持久化类必须覆盖 equals() 和 hashCode()方法,来实现组合的标识符的相等判断。实现Serializable 接口也是必须的。10.Generator 元素可选的子元素是一个 Java 类的名字,用来为该持久化类的实例生成唯一的标识。如果这个实例需要某些配置值或者初始化参数,用元素来传递。如下示例:_id_sequence下面是一些 Hibernate 内置:increment用于为 long, short 或者类型生成唯一标识。只有在没有其他进程往同一数据时才能使用
48、。在集群下不要使用。identity对 DB2, MS SQL Server, Sybase 和 HyicSQL 的内置标识字段提供支持。返回的标识符是 long, short 或者类型的。Sequence在 DB2,tgreSQL, Oracle, SAP DB, McKoi 中使用 sequence,而在erbase 中使用(generator)。返回的标识符是 long, short 或类型的。hilo使用一个高/低位算法高效的生成 long, short 或者类型的标识符。给定一个表和字段(默认分别是 hibernate_unique_key 和 next_hi)作为值的来源。高/低位
49、算法生成的标识符只在一个特定的数据库中是唯一的。Seqhilo使用一个高/低位算法来高效的生成 long, short 或者类型的标识符,给定一个数据库序列(sequence)的名字。40Uuid用一个 128-bit 的 UUID 算法生成字符串类型的标识符,这在一个网络中是唯一的(使用了 IP 地址)。UUID 被编码为一个 32 位 16 进制数字的字符串。guid在 MS SQL Server 和中使用数据库生成的 GUID 字符串。native根据底层数据库的能力选择 identity, sequence 或者hilo 中的一个。Assigned让应用程序在 save()之前为对象分
50、配一个标示符。这是元素没有指定时的默认生成策略。select通过数据库触发器选择一些唯一主键的行并返回主键值来分配一个主键。foreign使用另外一个相关联的对象的标识符。通常和使用。使用 UUIDUUID 包含:IP 地址、JVM 的启动时间(精确到 1/4 秒)、系统时间和一个计数器值(在 JVM 中唯一)。11. Property 元素元素为类定义了一个持久化的,JavaBean 风格的属性。name属性的名字,以小写字母开头column (可选- 默认为属性名字)对应的数据库字段名。也可以通过嵌套的元素指定。type (可选)一个 Hibernate 类型的名字。typename 可以
51、是如下几种:A:Hibernate 基本类型名(比如: eger, string, character,date, timest, float, binary,serializable, object, blob)。B :一个 Java 类的名字,这个类属于一种默认基础类型( 比如: , float,char,java.lang.String, java.util.Date, java.lang.eger, java.sql.Clob)。C:一个可以序列化的 Java 类的名字。D:一个自定义类型的类的名字。(比如:cn.javass.type.MyCustomType)。如果你没有指定类型,
52、Hibernarte 会使用反射来得到这个名字的属性,以此来猜测正确的 Hibernate 类型。Hibernate 会按照规则 B,C,D 的顺序对属性器(getter 方法)的返回类进行解释。然而,这还不够。在某些情况下你仍然需要 type 属性。(比如,为了区别Hibernate.DATE 和 Hibernate.TIMEST或者为了指定一个自定义类型。)update, insert (可选-默认为 true)表明用于 UPDATE 和/或 INSERT 的 SQL 语句中是否包含这个被了的字段。这二者如果都设置为 false 则表明这是一个“外源性(derived)”的属性,它的值来源
53、于42到同一个(或多个)字段的某些其他属性,或者通过一个 trigger(触发器)或其他程序生成。formula (可选)一个 SQL 表达式,定义了这个计算属性的值。计算属性没有和它对应的数据库字段,相当于是一个子查询。acs (可选默认值 property)Hibernate属性值的策略 acs 属性用来让你控制 Hibernate 如何在运行时属性。在默认情况下, Hibernate 会使用属性的 get/set 方法对。如果你指明 acs=field,Hibernate 会忽略 get/set 方法对,直接使用反射来成员变量。你也可以指定你自己的策略,这就需要你自己实现.perty.P
54、ropertyAcsor 接口,再在 acs 中设置你自定义策略类的名字。lazy (可选- 默认为 false)指定指定实例变量第一次被时,这个属性是否延迟抓取(fetched lazily)(需要运行时字节码增强)。unique (可选)使用 DDL 为该字段添加唯一的约束。同样,允许它作为 property-ref的目标。not-null (可选)使用 DDL 为该字段添加可否为空(nullability)的约束。optimistic-lock (可选- 默认为 true)指定这个属性在做更新时是否需要获得乐观锁定(optimistic lock)。换句话说,它决定这个属性发生脏数据时版
55、本(ver)的值是否增长。43generated (可选默认值 never)表明此属性值是否由数据库生成12.组件元素 元素把子对象的一些元素与父类对应的表的一些字段起来。然后组件可以定义它们自己的属性、组件或者集合。Name属性名。class(可选默认为通过反射得到的属性类型)组件(子)类的名字。44Insert被的字段是否出现在 SQL 的 INSERT 语句中?Update被的字段是否出现在 SQL 的 UPDATE 语句中?acs(可选默认为 property)Hibernate 用来属性值的策略。lazy(可选默认是 false)表明此组件应在实例变量第一次被的时候延迟加载(需要编译
56、时字节码装置器)。optimistic-lock(可选默认是 true)表明更新此组件是否需要获取乐观锁。换句话说,当这个属性变脏时,是否增加版本号(Ver)。unique(可选默认是 false)表明组件的所有字段上都有唯一性约束。其 子为子类的一些属性与表字段之间建立。组件(Component)是一个被包含的对象,在持久化的过程中,它被当作值类型,而并非一个实体的,指的是对象的。使用示例如下:1:新建一个M,包含字段:userId 和 name2:修改 UserM,在里面去掉 userId 和 name,然后添加一个字段:p,类型为M,也要对应的 getter 和 setter 方法3:在
57、UserM.hbm.xml 中修改配置如下:454:相应的修改Cnt 文件如下:/准备数据UserMum = new UserM();um.setUuid(13);um.setAge(1);Mpm = newM();pm.setUserId(id1);pm.setName(name1);um.setP(pm);13.join 元素元素,使用元素,假若在表之间存在一对一关联,可以将一个类的属性映射到多。46Table被连接表的名称。schema(可选)覆盖在根 元素中指定的 schema 名字。catalog(可选)覆盖在根 元素中指定的 catalog 名字。fetch(可选默认是 join)
58、如果设置为默认值 join,Hibernate 将使用一个内连接来得到这个类或其超类定义的,而使用一个外连接来得到其子类定义的。如果设置为 select,则 Hibernate 将为子类定义的 使用顺序选择。这仅在一行数据表示一个子类的对象的时候才会发生。对这个类和其超类定义的,依然会使用内连接得到。inverse(可选默认是 false)如果打开,Hibernate 不会或者更新此连接定义的属性。optional(可选默认是 false)如果打开,Hibernate 只会在此连接定义的属性非空时一行数据,并且总是使用一个外连接来得到这些属性。)的地址(address)信息可以被例如,一个人(
59、到单独的表中(并保留所有属性的值类型语义):.此特性常常对遗留数据模型有用14.properties 元素允许定义一个命名的逻辑分组(grou)包含一个类中的多个属性。这个元素最重要的用处是允许多个属性的组合作为 property-ref的目标()。这也是定义字段唯一约束的便途径。基本定义如下48Name分组的逻辑名称不是实际属性的名称。Insert被的字段是否出现在 SQL 的 INSERT 语句中update被的字段是否出现在 SQL 的 UPDATE 语句中optimistic-lock(可选默认是 true)表明更新此组件是否需要获取乐观锁。换句话说,当这个属性变脏时,是否增加版本号(
60、Ver)。unique(可选默认 false)表明组件的所有字段上都有唯一性约束。元素的简单示例在其他元素里面,就可以使用属性参照来了,如 property-ref=name4915.其他配置与对象继承相关的配置鉴别器(discriminator)、子类、连接的子类、联合子类、连接、Any 元素与关系相关的配置多对一(many-to-one)、一对一(one-to-one)、key与 ver类似的 times同样用在乐观锁的配置上,作为版本的替代。时间戳本质上是一种对乐观锁定的一种不是特别安全的实现,并不使用。自然 ID(natural-id)在元素中列出自然键的属性。Hibernate 会帮
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年度教育机构师资力量劳务外包合同3篇
- 2024年数据中心智能化改造工程协议版
- 《药敏试验的解读》课件
- 2024年标准厂房租赁托管协议版B版
- 2024年款汽车买卖与维修服务合同
- 2025门市租凭合同范本
- 2025合同样例物业股权抵押合同范本
- 2025焊接技术转让合同
- 应收账款质押贷款借款协议书
- 2024年棉花产业链上下游企业合作框架合同范本参考3篇
- 上肢内固定取出的手术配合
- 宝丰县永顺铝土有限公司铝土矿、高铝粘土矿、水泥灰岩矿矿山地质环境保护与土地复垦方案
- 2024年合肥高新公共资源交易有限公司招聘笔试参考题库附带答案详解
- 英才计划面试常见问题及解答
- (高清版)TDT 1058-2020 第三次全国国土调查县级数据库建设技术规范
- (高清版)TDT 1075-2023 光伏发电站工程项目用地控制指标
- 农业经济学重点整理-农业经济学重点整理
- 心理疗愈创业版
- 湖南省长沙市湘郡金海2022年小升初考试语文试卷1
- 公务员生涯发展展示
- 2024年同等学力人员申请硕士学位外国语水平全国统一考试
评论
0/150
提交评论