前一次做個系統用的oracle數據庫,使用hibernate生成主鍵的策略是SEQUENCE,當時覺得很累,因為不知道怎么的,oracle+sequence+trigger怎么也取不到新增數據時的主鍵值。
這次就把重點放這里了,同時還有兩個新的問題,
1。到底哪種hibernate生成主鍵的策略,性能優一點;
2。主鍵生成策略最好是能跨數據庫的。
大家都說性能,oracle都是用的sequence,所以主鍵還是想用這個方式生成。
接著就是返回新增數據的主鍵
native
根據底層數據庫的能力選擇 identity、sequence 或者 hilo 中的一個;
也就是說,主鍵生成,由hibernate選擇。
對于內部支持標識字段的數據庫(DB2、MySQL、Sybase 和 MS SQL),你可以使用 identity 關
鍵字生成。對于內部支持序列的數據庫(DB2、Oracle、PostgreSQL、Interbase、McKoi 和 SAP
DB),你可以使用 sequence 風格的關鍵字生成。這兩種方式對于插入一個新的對象都需要兩次
SQL 查詢。
查詢了一下更多的網上資料,不知道在哪里看到了,這種生成主鍵的策略,如果是mysql,他會選擇auto_increment方式生成主鍵;如果是oracle,他會選擇sequence方式;只是在使用oracle數據庫時,需要創建一個hibernate_sequence,這是hibernate保留的,不建會報錯(測試過)。
如下是完全的代碼:
Model:
package com.gwtjs.model;
/**
* @hibernate.class table="t_user"
*/
public class User {
/**
* @hibernate.id generator-class="native" length="32"
*/
private int id;
/**
* @hibernate.property type="string" length="32" unique="true" not-null="true"
*/
private String userName;
/**
* @hibernate.property type="string" length="32" not-null="true"
*/
private String userPwd;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserPwd() {
return userPwd;
}
public void setUserPwd(String userPwd) {
this.userPwd = userPwd;
}
}
hibernate?? mapping
oracle表創建腳本:
-- Create table
create table T_USER
(
id NUMBER(10) not null,
username VARCHAR2(32) not null,
userpwd VARCHAR2(32) not null
)
tablespace FOUNDDB
pctfree 10
initrans 1
maxtrans 255
storage
(
initial 64K
minextents 1
maxextents unlimited
);
-- Create/Recreate primary, unique and foreign key constraints
alter table T_USER
add primary key (ID)
using index
tablespace FOUNDDB
pctfree 10
initrans 2
maxtrans 255
storage
(
initial 64K
minextents 1
maxextents unlimited
);
alter table T_USER
add unique (USERNAME)
using index
tablespace FOUNDDB
pctfree 10
initrans 2
maxtrans 255
storage
(
initial 64K
minextents 1
maxextents unlimited
);
hibernate_sequence創建腳本
-- create user table sequence
create sequence t_user_seq
minvalue 1
maxvalue 9999999999
start with 1
increment by 1
nocache;
-- 公用的主鍵標識seq
CREATE SEQUENCE HIBERNATE_SEQUENCE MINVALUE 1 MAXVALUE 999999999999999999999999 INCREMENT BY 1 NOCYCLE;
-- 插入用戶的觸發器
create or replace trigger tri_insert_user
before insert on t_user
for each row
begin
select t_user_seq.nextval into :new.id from dual;
end;
Hibernate?? DAO
public class UserManagerImpl extends AbstractSearch implements UserManager {
public void saveOrUpdate(User u){
getHibernateTemplate().saveOrUpdate(u);
}
public void delete(int id){
getHibernateTemplate().delete(getUser(id));
}
public User getUser(int id){
return (User)getHibernateTemplate().get(User.class,id);
}
}
DAO? TEST? Base Class
public class DaoTestBase extends AbstractTransactionalDataSourceSpringContextTests {
protected String[] getConfigLocations() {
this.setAutowireMode(AUTOWIRE_BY_NAME);
this.setDefaultRollback(false);
return new String[]{
"classpath:spring-config.xml",
"classpath:/config/spring/applicationContext-dao.xml"
};
}
public void testConfig(){
assertNotNull("spring-mock context has bean init ",this.applicationContext);
}
}
User DAO? Test
public class UserManagerTest extends DaoTestBase {
private UserManager userManager;
public void testSave(){
User u = new User();
u.setUserName("admin888");
u.setUserPwd("654123");
userManager.saveOrUpdate(u);
logger.info(u.getId());
System.out.println("高度啊: "+u.getId());
userManager.delete(u.getId());
}
public void setUserManager(UserManager userManager){
this.userManager = userManager;
}
}
spring bean
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
完美的測試成功