新手建网站视频教程,无锡网站建设制作设计,潍坊做网站的网络公司,开店加盟前一次做个系统用的oracle数据库#xff0c;使用hibernate生成主键的策略是SEQUENCE,当时觉得很累#xff0c;因为不知道怎么的#xff0c;oraclesequencetrigger怎么也取不到新增数据时的主键值。这次就把重点放这里了#xff0c;同时还有两个新的问题#xff0c;1。到底…前一次做个系统用的oracle数据库使用hibernate生成主键的策略是SEQUENCE,当时觉得很累因为不知道怎么的oraclesequencetrigger怎么也取不到新增数据时的主键值。这次就把重点放这里了同时还有两个新的问题1。到底哪种hibernate生成主键的策略性能优一点;2。主键生成策略最好是能跨数据库的。大家都说性能oracle都是用的sequence,所以主键还是想用这个方式生成。接着就是返回新增数据的主键native根据底层数据库的能力选择 identity、sequence 或者 hilo 中的一个;也就是说主键生成由hibernate选择。对于内部支持标识字段的数据库(DB2、MySQL、Sybase 和 MS SQL)你可以使用 identity 关键字生成。对于内部支持序列的数据库(DB2、Oracle、PostgreSQL、Interbase、McKoi 和 SAPDB)你可以使用 sequence 风格的关键字生成。这两种方式对于插入一个新的对象都需要两次SQL 查询。查询了一下更多的网上资料不知道在哪里看到了这种生成主键的策略如果是mysql,他会选择auto_increment方式生成主键;如果是oracle,他会选择sequence方式只是在使用oracle数据库时需要创建一个hibernate_sequence,这是hibernate保留的不建会报错(测试过)。如下是完全的代码Model:package com.gwtjs.model;/*** hibernate.class tablet_user*/public class User {/*** hibernate.id generator-classnative length32*/private int id;/*** hibernate.property typestring length32 uniquetrue not-nulltrue*/private String userName;/*** hibernate.property typestring length32 not-nulltrue*/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 mappingoracle表创建脚本-- Create tablecreate table T_USER(id NUMBER(10) not null,username VARCHAR2(32) not null,userpwd VARCHAR2(32) not null)tablespace FOUNDDBpctfree 10initrans 1maxtrans 255storage(initial 64Kminextents 1maxextents unlimited);-- Create/Recreate primary, unique and foreign key constraintsalter table T_USERadd primary key (ID)using indextablespace FOUNDDBpctfree 10initrans 2maxtrans 255storage(initial 64Kminextents 1maxextents unlimited);alter table T_USERadd unique (USERNAME)using indextablespace FOUNDDBpctfree 10initrans 2maxtrans 255storage(initial 64Kminextents 1maxextents unlimited);hibernate_sequence创建脚本-- create user table sequencecreate sequence t_user_seqminvalue 1maxvalue 9999999999start with 1increment by 1nocache;-- 公用的主键标识seqCREATE SEQUENCE HIBERNATE_SEQUENCE MINVALUE 1 MAXVALUE 999999999999999999999999 INCREMENT BY 1 NOCYCLE;-- 插入用户的触发器create or replace trigger tri_insert_userbefore insert on t_userfor each rowbeginselect t_user_seq.nextval into :new.id from dual;end;Hibernate DAOpublic 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 Classpublic 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 Testpublic 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 beanxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd完美的测试成功