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
發(fā)送給數據庫的
sql
顯示出來
-->
<!-- Mapping files -->
<mapping resource="cat.hbm.xml"/>
</session-factory>
</hibernate-configuration>
數據庫表主鍵的知識點:
Generator
為每個
POJO
的實例提供唯一標識。一般情況,我們使用“
native
”。
class
表示采用由生成器接口
net.sf.hibernate.id.IdentifierGenerator
實現(xiàn)的某個實例,其中包括:
“
assigned
”
主鍵由外部程序負責生成,在
save()
之前指定一個。
“
hilo
”
通過
hi/lo
算法實現(xiàn)的主鍵生成機制,需要額外的數據庫表或字段提供高位值來源。
“
seqhilo
”
與
hilo
類似,通過
hi/lo
算法實現(xiàn)的主鍵生成機制,需要數據庫中的
Sequence
,適用于支持
Sequence
的數據庫,如
Oracle
。
“
increment
”
主鍵按數值順序遞增。此方式的實現(xiàn)機制為在當前應用實例中維持一個變量,以保存著當前的最大值,之后每次需要生成主鍵的時候將此值加
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
”
使用另外一個相關聯(lián)的對象的標識符作為主鍵。
以下舉例:
1
、指定參數的情況:
<id name="id" unsaved-value="0">
<generator class="sequence">
<param name="sequence">SEQ_CHILD</param>
</generator>
</id>
使用的是
sequence
,適合
oracle
數據庫;
2
、對于
sql server2000
中的數據庫子增字段
,
在配置文件使用下列方法實現(xiàn):
<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
關鍵字來實現(xiàn)
3
、如果表中的主鍵用字符串類型
:
可以用
hibernate
自己提供的方法實現(xiàn)主鍵唯一
:
<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.
多對多關系
,
一般我們是做一個中間關聯(lián)表
.
我用角色和權限做了個例子
,
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
來實現(xiàn)
;
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)
我在寫實現(xiàn)基本
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
來處理返回結果
,
容易出錯
.
posted on 2006-09-06 16:47
周銳 閱讀(179)
評論(0) 編輯 收藏 所屬分類:
Hibernate