目前
JPA(Java Persistence API)的使用范圍越來越廣
作為Java EE
平台標准的ORM規范
得到了諸如
Hibernate
TopLink
OpenJpa等ORM框架的支持
同時還是EJB
的重要組成部分
JPA的宗旨是為POJO提供持久化標准規范
它能夠脫離容器獨立運行
方便開發和測試
本文將通過一個小實例來說明如何在Hibernate中使用JPA
來達到簡化編程的目的
開發環境 Eclipse
MyEclipse
GA Tomcat
SQL Server
hibernate
GA hibernate
annotations
GA
ejb
persistence hibernate
commons
annotations
GA
本文是為後續的多種Ajax技術框架應用系列作一個前期准備
讓大家先了解一下相比與以前的Hibernate ORM映射的不同之處
以及采用JPA所帶來的好處
為了保證程序能順序運行
避免不同的Eclipse版本之間產生錯誤
大象強烈建議
下載源碼後
按源碼中的工程名
自己單獨新建同一個工程
再將src和WEB
INF/lib目錄下的所有文件COPY至對應的目錄下
創建Web Project
點擊
File
>
New
選擇
Web Project
在
Project Name
中輸入ajax
點擊
Finish
下載本文後面需要用到的JAR包
加入到WEB
INF/lib目錄下
在ajax工程中
文本采用的是UTF
編碼
創建HibernateSessionFactory
傳統的方法就是在工程名上點右鍵
選擇
MyEclipse
>
Add Hibernate Capabilities
然後就是按照提示一步一步做
不過在MyEclipse
中添加Hibernate還是只能支持
除非你選擇
Add Spring Capabilities
裡面才有Hibernate
的類庫
要想完全兼容JPA
必須采用
以上版本
這裡大家直接使用源碼中的HibernateSessionFactory
注意請先建包
re
HibernateSessionFactory中有一個地方需要改動
原來的寫法是
private static Configuration configuration = new Configuration(); 修改後為
private static AnnotationConfiguration configuration = new AnnotationConfiguration(); 因為我們采用的是JPA注釋方式來映射實體
另外AnnotationConfiguration這個類在hibernate
annotations
jar這個包中
創建BaseDao
在re包下面新建BaseDao抽象類
裡面定義的是持久化操作方法
有一點特別要注意
一定要在增加
刪除
修改這幾個方法中加入事務控制
不管是在BaseDao基類方法中加
還是在業務方法中加
一定要加事務控制
大象覺得在基類中加會比較好一點
這樣做代碼顯得更少更簡潔
如果不加事務控制
那麼增
刪
改這些操作都不會產生效果
因為默認情況下
它不會進行自動提交
在做這個例子的時候
這個問題曾經困擾了我好長時間
因此
請大家記住不要再犯和大象一樣的錯誤!貼出部分代碼
詳情請看源碼
裡面有很全面的注釋
/**
* 抽象Dao類
用於持久化操作
* @author 菠蘿大象
* @version
*/
public abstract class BaseDao<T> {
private static Log log = LogFactory
getLog(BaseDao
class);
/**
* 獲取Hibernate的Session對象
*/
public Session getSession(){
return HibernateSessionFactory
getSession();
}
/**
* 根據主鍵得到對象
*/
public T getObject(Class clazz
Serializable id){
return (T)getSession()
get(clazz
id);
}
/**
* 保存對象
*/
public void saveObject(T t) {
Session session = getSession();
Transaction tx = beginTransaction(session);
try{
session
saveOrUpdate(t);
mit();
}catch(Exception e){
tx
rollback();
log
error(
保存對象失敗
);
}
}
/**
* 創建事務
*/
private Transaction beginTransaction(Session session){
return session
beginTransaction();
}
}
創建Employee
在com
ajax
employee
mode包下新建Employee類
這個就是POJO類
下面來詳細說明裡面的含義
@Entity
@Table(name =
EMPLOYEE
)
public class Employee implements java
io
Serializable{
private Integer employee_id; //人員ID(主鍵)
private String employee_name; //人員姓名
private String sex; //性別
private String birthday; //出生日期
private String address; //地址
@Id
@Column(name =
EMPLOYEE_ID
)
@TableGenerator(
name=
tab
store
table=
GENERATOR_TABLE
pkColumnName =
G_KEY
pkColumnValue=
EMPLOYEE_PK
valueColumnName =
G_VALUE
allocationSize=
)
@GeneratedValue(strategy = GenerationType
TABLE
generator=
tab
store
)
public Integer getEmployee_id() {
return employee_id;
}
public void setEmployee_id(Integer employee_id) {
this
employee_id = employee_id;
}
} 其它幾個屬性的getter和setter省略
這裡我們要用到ejb
persistence
jar
JPA的注解類就在這個包中
下面詳細說明上面使用到的注解
@Entity
通過@Entity注解將一個類聲明為一個實體bean
@Table
通過 @Table注解可以為實體bean映射指定表
name屬性表示實體所對應表的名稱
如果沒有定義 @Table
那麼系統自動使用默認值
實體的類名(不帶包名)
@Id
用於標記屬性的主鍵
@Column
表示持久化屬性所映射表中的字段
如果屬性名與表中的字段名相同
則可以省略@Column注解
另外有兩種方式標記
一是放在屬性前
另一種是放在getter方法前
例如
@Column(name =
EMPLOYEE_NAME
)
private String employee_name; 或者
@Column(name =
EMPLOYEE_NAME
)
public String getEmployee_name() {
return employee_name;
} 這兩種方式都是正解的
根據個人喜好來選擇
大象偏向於第二種
並且喜歡將屬性名與字段名設成一樣的
這樣可以省掉@Column注解
使代碼更簡潔
@TableGenerator
表生成器
將當前主鍵的值單獨保存到一個數據庫表中
主鍵的值每次都是從指定的表中查詢來獲得
這種生成主鍵的方式是很常用的
這種方法生成主鍵的策略可以適用於任何數據庫
不必擔心不同數據庫不兼容造成的問題
大象推薦這種方式管理主鍵
很方便
集中式管理表的主鍵
而且更換數據庫不會造成很大的問題
各屬性含義如下
name
表示該表主鍵生成策略的名稱
這個名字可以自定義
它被引用在@GeneratedValue中設置的
generator
值中
table
表示表生成策略所持久化的表名
說簡單點就是一個管理其它表主鍵的表
本例中
這個表名為GENERATOR_TABLE
pkColumnName
表生成器中的列名
用來存放其它表的主鍵鍵名
這個列名是與表中的字段對應的
pkColumnValue
實體表所對應到生成器表中的主鍵名
這個鍵名是可以自定義滴
valueColumnName
表生成器中的列名
實體表主鍵的下一個值
假設EMPLOYEE表中的EMPLOYEE_ID最大為
那麼此時
生成器表中與實體表主鍵對應的鍵名值則為
allocationSize
表示每次主鍵值增加的大小
例如設置成
則表示每次創建新記錄後自動加
默認為
@GeneratedValue
定義主鍵生成策略
這裡因為使用的是TableGenerator
所以
主鍵的生成策略為GenerationType
TABLE
生成主鍵策略的名稱則為前面定義的
tab
store
這裡大象想說下
網上有很多文章寫的是strategy = GenerationType
AUTO或是strategy = GenerationType
SEQUENCE
采用SEQUENCE序列是因為Oracle數據中不支持identity自動增長
要想使用它
還得在數據庫中創建一個序列
如果要更換數據庫
那將是一個非常麻煩的事情
SEQUENCE生成方式我們暫且不談
這裡說下采用AUTO和IDENTITY的生成方式
本例采用的是SQL Server
作為數據庫
所以如果想使用AUTO或是IDENTITY生成策略
則一定要對主鍵加上identity標識
如identity(
)
不過對於AUTO來說
是根據不同的數據庫選擇最合適的自增主鍵生成策略
如果使用MySQL
則主鍵要定義AUTO_INCREMENT
如果是Oracle
則要創建Sequence來實現自增
不管采用何種生成策略
增
刪
改這些方法中一定要加入事務
否則數據是不會添加到數據庫中滴~~~這是大象反復測試過的結果!
創建數據庫及表
接下來
我們需要為本例創建一個數據庫及必要的表
數據庫名為ajax
表只有兩個EMPLOYEE和GENERATOR_TABLE
下面是SQL腳本
CREATE TABLE EMPLOYEE(
EMPLOYEE_ID int not null
EMPLOYEE_NAME varchar (
) null
SEX char (
) null
BIRTHDAY varchar(
) null
ADDRESS varchar(
) null
CONSTRAINT PK_EMPLOYEE PRIMARY KEY (EMPLOYEE_ID)
)
CREATE TABLE GENERATOR_TABLE(
ID int not null
G_KEY varchar(
) null
G_VALUE int null
CONSTRAINT PK_GENERATOR_TABLE PRIMARY KEY (ID)
)
INSERT INTO GENERATOR_TABLE VALUES(
EMPLOYEE_PK
) 如果你覺得麻煩
不想建庫及表
可以將後面的數據庫下載下來
然後還原數據庫就可以了
修改hibernatecfgxml
本例中
采用的是JTDS連接驅動
我們要對配置文件作一些設置
另外還要加入POJO類
<property name=
dialect
>org
hibernate
dialect
SQLServerDialect</property>
<property name=
connection
driver_class
>net
sourceforge
jtds
jdbc
Driver</property>
<property name=
connection
url
>jdbc:jtds:sqlserver://localhost:
/ajax</property>
<property name=
connection
username
>sa</property>
<property name=
connection
password
>自己密碼(無密碼就空著)</property>
<!
實體類
>
<mapping class=
com
ajax
employee
model
Employee
/> 以前沒有使用JPA注解的時候
我們這裡加入的都是hbm
xml文件
現在我們則加入的是類
創建EmployeeManager
在com
ajax
employee
service下新建EmployeeManager類
這裡面就是寫業務方法
另外在這個類中添加一個main方法用於測試
將log
j的日志級別調整為DEBUG
這樣我們就可以看到很詳細的程序運行信息
源碼中的注釋很詳細
這裡就不貼出來了
本例沒有提供MySQL和Oracle數據庫的腳本
不過這些應該很簡單
按照最基本的方式建一個數據庫和兩張表就行了
這裡附上兩種數據庫的hibernate配置
MySQL
<property name=
hibernate
dialect
>org
hibernate
dialect
MySQLInnoDBDialect</property>
<property name=
connection
driver_class
>com
mysql
jdbc
Driver</property>
<property name=
connection
url
>jdbc:mysql://localhost:
/ajax</property>
<property name=
connection
username
>root</property>
<property name=
connection
password
>自己的密碼(無密碼就空著)</property> Oracle
<property name=
hibernate
dialect
>org
hibernate
dialect
OracleDialect</property>
<property name=
connection
driver_class
>oracle
jdbc
driver
OracleDriver</property>
<property name=
connection
url
>jdbc:oracle:thin:@
:
:自己的SID</property>
<property name=
connection
username
>system</property>
<property name=
connection
password
>自己的密碼(無密碼就空著)</property> 本文主要是從實用的角度來說明如何在Hibernate中使用JPA注釋來簡化開發
以及為後面的多種Ajax技術框架應用系列作一個前期准備
從這裡可以看出
我們不需要再編寫繁瑣的hbm
xml文件
另外
JPA的功能很強大
這裡只展示了其中的冰山一角
如果想深入學習JPA的話
請單獨查找資料或購買相關書籍
下面是本例中必須的JAR包
點擊下載
antlr
asm
cglib
commons
collections
commons
lang
commons
logging
log
j
ehcache
ejb
persistence
hibernate
hibernate
annotations
hibernate
commons
annotations
mysql
connector
jar jtds
jar classes
jar
點擊下載
ajax_project db_ajax
本文為菠蘿大象原創
如要轉載請注明出處
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28835.html