- 浏览: 118619 次
- 性别:
- 来自: 成都
文章分类
最新评论
-
liguocai2009:
liguocai2009 写道经过我我的测试,600万的数据, ...
Oracle row_number() over()解析函数高效实现分页 -
liguocai2009:
经过我我的测试,600万的数据,row_number()耗时4 ...
Oracle row_number() over()解析函数高效实现分页 -
学会做人:
lbs1988 写道扯淡 谁说row_number() ove ...
Oracle row_number() over()解析函数高效实现分页 -
lbs1988:
扯淡 谁说row_number() over 效率高 他们效率 ...
Oracle row_number() over()解析函数高效实现分页 -
id0096:
没觉得效率高到哪里去...用180W条数据测试,很多情况下没有 ...
Oracle row_number() over()解析函数高效实现分页
Hibernate.cfg.xml配置文件:
- <?xml version="1.0" encoding="utf-8"?>
- <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN" "hibernate-configuration-2.0.dtd">
- <hibernate-configuration>
- <session-factory>
- <!-- properties -->
- <!-- jndi -->
- <property name="connection.datasource">java:comp/env/jdbc/quickstart</property>
- <property name="connection.provider_class">net.sf.hibernate.connection.DatasourceConnectionProvider</property>
- <property name="dialect">net.sf.hibernate.dialect.SQLServerDialect</property>
- <!-- jdbc
- <property name="connection.url">jdbc:microsoft:sqlserver://localhost:1433;SelectMethod=cursor;DatabaseName=pubs</property>
- <property name="connection.driver_class">com.microsoft.jdbc.sqlserver.SQLServerDriver</property>
- <property name="connection.username">sa</property>
- <property name="connection.password"></property>
- -->
- <property name="jdbc.fetch_size">50</property><!-- 一次读的数据库记录数 -->
- <property name="jdbc.batch_size">30</property><!-- 设定对数据库进行批量删除 -->
- <property name="show_sql">true</property><!-- 将Hibernate发送给数据库的sql显示出来 -->
- <!-- Mapping files -->
- <mapping resource="cat.hbm.xml"/>
- </session-factory>
- </hibernate-configuration>
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN" "hibernate-configuration-2.0.dtd"> <hibernate-configuration> <session-factory> <!-- properties --> <!-- jndi --> <property name="connection.datasource">java:comp/env/jdbc/quickstart</property> <property name="connection.provider_class">net.sf.hibernate.connection.DatasourceConnectionProvider</property> <property name="dialect">net.sf.hibernate.dialect.SQLServerDialect</property> <!-- jdbc <property name="connection.url">jdbc:microsoft:sqlserver://localhost:1433;SelectMethod=cursor;DatabaseName=pubs</property> <property name="connection.driver_class">com.microsoft.jdbc.sqlserver.SQLServerDriver</property> <property name="connection.username">sa</property> <property name="connection.password"></property> --> <property name="jdbc.fetch_size">50</property><!-- 一次读的数据库记录数 --> <property name="jdbc.batch_size">30</property><!-- 设定对数据库进行批量删除 --> <property name="show_sql">true</property><!-- 将Hibernate发送给数据库的sql显示出来 --> <!-- Mapping files --> <mapping resource="cat.hbm.xml"/> </session-factory> </hibernate-configuration>
数据库表主键的知识点:
Generator 为每个 POJO 的实例提供唯一标识。一般情况,我们使用“native”。class 表示采用由生成器接口net.sf.hibernate.id.IdentifierGenerator 实现的某个实例,其中包括:
“assigned”
主键由外部程序负责生成,在 save() 之前指定一个。
“hilo”
通过hi/lo 算法实现的主键生成机制,需要额外的数据库表或字段提供高位值来源。
“seqhilo”
与hilo 类似,通过hi/lo 算法实现的主键生成机制,需要数据库中的 Sequence,适用于支持 Sequence 的数据库,如Oracle。
“increment”
主键按数值顺序递增。此方式的实现机制为在当前应用实例中维持一个变量,以保存着当前的最大值,之后每次需要生成主键的时候将此值加1作为主键。这种方式可能产生的问题是:不能在集群下使用。
“identity”
采用数据库提供的主键生成机制。如DB2、SQL Server、MySQL 中的主键生成机制。
“sequence”
采用数据库提供的 sequence 机制生成主键。如 Oralce 中的Sequence。
“native”
由 Hibernate 根据使用的数据库自行判断采用 identity、hilo、sequence 其中一种作为主键生成方式。
“uuid.hex”
由 Hibernate 基于128 位 UUID 算法 生成16 进制数值(编码后以长度32 的字符串表示)作为主键。
“uuid.string”
与uuid.hex 类似,只是生成的主键未进行编码(长度16),不能应用在 PostgreSQL 数据库中。
“foreign”
使用另外一个相关联的对象的标识符作为主键。
以下举例:
1、指定参数的情况:
- <id name="id" unsaved-value="0">
- <generator class="sequence">
- <param name="sequence">SEQ_CHILD</param>
- </generator>
- </id>
<id name="id" unsaved-value="0"> <generator class="sequence"> <param name="sequence">SEQ_CHILD</param> </generator> </id>
使用的是sequence,适合oracle数据库;
2、对于sql server2000中的数据库子增字段,在配置文件使用下列方法实现:
- <id name="id" type="long" unsaved-value="0">
- <column name="id" sql-type="numeric" not-null="true" />
- <generator class="identity" />
- </id>
<id name="id" type="long" unsaved-value="0"> <column name="id" sql-type="numeric" not-null="true" /> <generator class="identity" /> </id>
这里主要是:identity:代表由sql server2000数据库自己提供子增字段.如果要hibernate自己提供,则用increment关键字来实现
3、如果表中的主键用字符串类型:可以用hibernate自己提供的方法实现主键唯一:
- <id name="id" type="string" unsaved-value="null">
- <column name="cid" sql-type="char(32)" not-null="true" />
- <generator class="uuid.hex" />
- </id>
<id name="id" type="string" unsaved-value="null"> <column name="cid" sql-type="char(32)" not-null="true" /> <generator class="uuid.hex" /> </id>
使用的是uuid.hex: 采用128位的算法来生成一个32位字符串。最通用的一种方式。适用于所有数据库。
重要的知识点:
1. 如果有部门表,有员工表,员工表中有dep_id,则表部门类和员工类是one-to-many的关系:
可以使用: ( 在部门类department中使用下列)
Department类:
/** 部门的所有员工 */
private Set staffs = new TreeSet();
xml的文件:
<set name="staffs" > <key column="dep_id"/> <one-to-many class="hbp.sys.data.Staff"/> </set>
如果是list,需要用索引<index> </index>,具体其中的含义,不是很明白.待以后研究
2. 如果部门要有一个负责人,即部门表(tb_department)中有一个字段:staff_id.
那么表示部门和负责人之间的关系是many-to-one的关系
Department类:
/** 部门负责人id */
private Staff staff;
xml 文件
<many-to-one name="staff" class="hbp.sys.data.Staff" column="staff_id"/>
3. 多对多关系,一般我们是做一个中间关联表.我用角色和权限做了个例子,
Right(id,name) Role(id,name) 中间表:tb_role_right(role_id,right_id)
Right类中有一个Role的集合:private Set roles=new TreeSet();
Role类中也有一个Right的集合:private Set rights=new TreeSet();
则两者是明显的多对多关系.使用many-to-many来实现;
xml文件中
right.hbm.xml:如下:
- <set name="roles" table="tb_role_right" cascade="all">
- <key column="right_id"/>
- <many-to-many column="role_id" class="hbp.sys.data.Role"/>
- </set>
<set name="roles" table="tb_role_right" cascade="all"> <key column="right_id"/> <many-to-many column="role_id" class="hbp.sys.data.Role"/> </set>
role.hbm.xml文件中类似:
- <set name="rights" table="tb_role_right" cascade="all">
- <key column="role_id"/>
- <many-to-many column="right_id" class="hbp.sys.data.Right"/>
- </set>
<set name="rights" table="tb_role_right" cascade="all"> <key column="role_id"/> <many-to-many column="right_id" class="hbp.sys.data.Right"/> </set>
4. 几个值得注意的问题:
a)在xml?映射文件中,写类的名字时一定用类的全名:即:包+类名如:(hbp.sys.data.Staff),这个错误使我费了半天劲.:(
b)我在写实现基本DAO操作时,写了
session.delete("from Right as right where right.id="+id);
程序死活报错,我折腾了半天,跟踪到底,才恍然大悟,hibernate在解析sql语句的时候把
其中的right,当成了数据库中的右连接("保留字"),唉,这种关键字,不能随便用啊,:)
5. hibernate中HQL语言的查询根据你的sql的不同而返回不同的对象类型.
如果你使用session.find(String hql)
一般会返回一个List,如:from Staff staff;返回的是包含所有的员工对象的集合
如你的hql为:select count(*) from Staff staff;则返回的是一个Integer对象
如果你使用的hql为:select count(distinct staff.name),count(*) from Staff staff;则返回的是一个Object
即Object[],需要先把他转换成Object[],然后在取[0],[1].
这种设计我不知道hibernate是如何处理的,感觉既好也不好.好的是可以使用一个find获得任意查询
不好在于根据hql来处理返回结果,容易出错.
发表评论
-
基于Spring的注释的配置
2009-06-18 20:55 2634<?xml version="1.0" ... -
Dwr框架的DWRUtil的理解
2009-06-16 18:41 1505util.js util.js包含了一些使用的方法,从而帮助 ... -
Hibernate的SQL方言
2009-06-16 17:07 1248如果出现如下错误,则可能是Hibernate SQL方言 ... -
JAVA AJAX框架 DWR
2009-06-11 23:40 1901uDWR是什么 Direct Web ... -
基于注释Spring配置
2009-06-10 23:30 1709一:概述注释配置相 ... -
web service
2009-06-05 08:09 977现在已经进入系统集成阶段 、遗留系统的集成 集成分为:EAI ... -
SSH整合
2009-06-03 00:34 615最近写ssh整合的测试代码时! 很烦的是哪个myclipse ... -
Spring和Hibernate的整合
2009-05-31 21:32 936在Spring 中整合Hibernate的话 在配置文件app ... -
Hibernate的对象--关系映射(2)
2009-05-31 20:06 1195对象与映射关系总结2 ... -
Hibernate查询的总结
2009-05-31 20:04 1188一、hibernate查询 1、测试list和Ite ... -
Spring中的声明式事物
2009-05-31 19:43 1130Nerver : ... -
Spring中的事务管理器(Aspectj)
2009-05-28 17:16 1308Spring 的AOP确实强大! 但是AOP在实际的工作运用中 ... -
日志记录Log4j
2009-05-28 08:37 133Log日志:主要用于记录 ... -
Hibernate的inverse和cascade的理解
2009-05-24 19:30 8754. hibernate如何根据pojo来 ... -
Hibernate查询的几个重要理解
2009-05-19 22:32 1137一、hibernate查询 1、测试list和I ... -
Hibernate的对象--关系映射(1)
2009-05-14 00:02 1255... -
Hibernate入门
2009-05-12 18:11 2681、为什么要有hibernate? ... -
Struts中常用的几种Action
2009-05-11 21:04 294除了基本的Action 之外, Struts 还提供了几个其他 ...
相关推荐
Hibernate主键生成策略.doc ··········
常用Hibernate主键生成策略 常用Hibernate主键生成策略 常用Hibernate主键生成策略 常用Hibernate主键生成策略
hibernate主键生成策略
hibernate 主键生成策略 说明简单,易懂,全面,
NULL 博文链接:https://alpha2009.iteye.com/blog/1074750
Hibernate主键生成策略.docHibernate主键生成策略.doc
Hibernate中主键生成策略,开发的时候经常会用到的我都整理到这里了~
Hibernate各种主键生成策略详解,包括 assigned increment hilo seqhilo sequence identity native uuid foreign uuid.hex sequence-identity 等
Hibernate各种主键生成策略与配置详解 1、assigned 主键由外部程序负责生成,在 save() 之前必须指定一个。Hibernate不负责维护主键生成。与Hibernate和底层数据库都无关,可以跨数据库。在存储对象前,必须要使用...
关于Hibernate的各种主键生成策略与配置详解
hibernate 的主键的几种生成类型的区别,主要有那些主键类型
Hibernate 主键生成策略