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>
数据库表主键的知识点:
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>
使用的是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>
这里主要是: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>
使用的是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>
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>
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来处理返回结果,容易出错.
分享到:
相关推荐
@Id用于标记主键字段,可以配合@IdClass或@GeneratedValue来定义主键生成策略。 2. **属性注解**:@Column定义列名和属性,如长度、是否允许为空等。@GeneratedValue用于设置自动增长策略,如IDENTITY、SEQUENCE或...
其中,关于主键生成策略的讨论,如Hi/Lo算法、UUID算法和自动增长列的处理,为开发者提供了多种选择,以适应不同的场景需求。 综上所述,《hibernate-reference-3.1.1.pdf》不仅是一份技术手册,更是Hibernate...
### Hibernate配置详解与...通过以上解析,我们不仅理解了`hibernate.cfg.xml`的基本结构与核心配置,还深入了解了Hibernate主键生成策略以及实体关系映射的关键概念,这对于高效地进行数据库操作和管理具有重要意义。
总的来说,选择合适的主键生成策略和正确配置是Hibernate成功集成到项目的关键步骤。理解这些策略的差异以及它们如何与不同数据库交互,将有助于优化性能并避免潜在的问题。在实际开发中,应根据项目需求和所使用的...
- 包括定义表名、字段映射以及主键生成策略等内容。 - **1.2.3 Hibernate配置** - 描述如何通过`hibernate.cfg.xml`文件来配置Hibernate,包括数据库连接信息、方言设置等。 - **1.2.4 用Ant构建** - 指导如何...
**Hibernate参考手册中文版** Hibernate是一款强大的Java对象关系映射(ORM)框架,它简化了数据库操作,使得开发者可以使用面向对象的方式处理数据库事务。在《Hibernate参考手册中文版》中,我们将深入探讨这个...
- 自定义主键生成策略,如SequenceGenerator、TableGenerator等。 12. **事件监听与拦截器** - 实现Hibernate事件监听器,监听对象的生命周期事件。 - 使用Interceptor,自定义逻辑,如对象的预加载、预更新等。...
- 数据库特定的主键生成策略。 - 示例:MySQL 使用 `AUTO_INCREMENT`。 - **分配标识符** - 用户手动指定主键值。 - 示例: ```xml ``` - **主键生成策略** - 选择合适的生成策略是优化应用性能的关键。 ...
这包括了主键生成策略、属性类型映射、关联关系(一对一、一对多、多对一、多对多)的配置,以及懒加载(Lazy Loading)和级联操作(Cascading)等高级特性。 在事务处理部分,手册会阐述Hibernate的事务管理机制,...
常见的注解包括`@Entity`(表示数据库表)、`@Id`(主键)、`@GeneratedValue`(主键生成策略)等。 5. **查询语言(HQL)**:Hibernate Query Language是Hibernate特有的面向对象的查询语言,类似于SQL,但更适应...
《Hibernate官方参考手册》是学习和理解Hibernate的核心资料,提供了详尽的API文档、配置指南和使用示例。以下是对Hibernate的一些关键知识点的详细说明: 1. **对象关系映射(ORM)**:ORM是Hibernate的核心特性,...
- **主键生成策略**:介绍主键生成的不同策略。 **4.1.3 优选非最终类** - **非最终类优势**:探讨为什么建议使用非最终类。 - **示例代码**:给出具体的非最终类示例代码。 **4.1.4 声明持久化字段的访问器和...
- **id**:配置主键生成策略。 - **增强的标识符生成器**:更复杂的主键生成逻辑。 - **composite-id**:处理复合主键。 - **鉴别器**:在多态映射中区分子类。 - **版本**:支持乐观锁机制。 - **timestamp**:自动...
- **generator**:主键生成策略,如`increment`、`identity`等。 - **Hi/Lo算法**:一种高效的主键生成算法。 - **UUID算法**:生成全局唯一的标识符。 - **标识列和序列**:对于支持标识列或序列的数据库系统。...
- **主键生成策略**:包括自增、UUID 等多种策略,可根据实际需求选择合适的策略。 - **关联映射**:一对多、多对多等关系的实现方法。 #### 五、查询与检索 - **HQL (Hibernate Query Language)**:一种面向对象...
映射包括字段映射、主键生成策略、关联映射(一对一、一对多、多对一、多对多)以及自定义类型映射等。 除此之外,Hibernate还支持复杂的查询操作,如分页、排序、聚合函数以及子查询。在处理大数据量时,可以通过...
例如,@Entity表示这是一个实体类,@Table指定对应的数据库表,@Id标记主键字段,@GeneratedValue自动生成主键等。 4. **数据操作** Hibernate提供了多种方式来操作数据,包括: - **CRUD操作**:创建(Create)...
- **Entity Mapping**:通过Hibernate的XML映射文件(.hbm.xml)或注解方式,将Java类与数据库表关联起来,定义字段映射和主键生成策略。 - **SessionFactory和Session**:SessionFactory是Hibernate的核心,它负责...