??xml version="1.0" encoding="utf-8" standalone="yes"?> setMaxResultQ)讄q回的信息条敎ͼsetFirstResultQ)讄查询l果的初始位|,上面的程序段可以实现分页?/p>
在hibernate的Session里面使用createCriteria可以创徏一个Criteria实例帮助我们q行条g查询Q不用自׃hql语句Q很方便?br />
用法很简单,首先传Class实例创徏CriteriaQClass实例对应你想要查询的那个实体:
如果我们要查询User的所有信息我们可以如下用CriteriaQ?/p>
List users = crit.list();
for (ListIterator iterator = users.listIterator(); iterator.hasNext(); ) {
User user = (User) iterator.next();
System.out.println("name: " + user.getName());
System.out.println("age: " + user.getAge());
}
我们要ؓ查询限定条gQ可以通过net.sf.hibernate.expression.Expression讄Expression有很多的条g查询Ҏ下面举一些例子:
crit.add(Expression.ge("age", new Integer(25)));
List users = crit.list();
geQ)表示大于{于Q即age大于{于25的user?/p>
crit.add(Expression.between("weight", new Integer(60)Q?/span>new Integer(80)));
List users = crit.list();
between表示weight?0?0之间?br />
crit.add(Expression.or(
Expression.eq("age", new Integer(20)),
Expression.isNull("age")
));
List users = crit.list();
eq表示age?0的user?br />
crit.setFirstResult(51);
crit.setMaxResult(50);
List users = crit.list();
然后调用Criteria的addҎ加入条gQRestrictionsQ。常用的条g有:
Ҏ说明Q?Restrictions.eq {于
Restrictions.allEq 使用MapQ用key/valueq行多个{于的对?br />
Restrictions.gt 大于 >
Restrictions.ge 大于{于 >=
Restrictions.lt 于 <
Restrictions.le 于{于 <=
Restrictions.between 对应SQL的BETWEEN子句
Restrictions.like 对应SQL的LIKE子句
Restrictions.in 对应SQL的in子句
Restrictions.and and关系
Restrictions.or or关系
Restrictions.sqlRestriction SQL限定查詢
例如Q我惌回Person实体里面q龄(age)大于20的记录,那么׃ؓCriteria加入Restrictions.gt条gQ?br />
Restrictions.and和Restrictions.or很有用,表示and查询q是or查询Q例如我要查询Person实体里面q龄(age)大于20Q或者性别 (sex)为man
的记录,那么׃ؓCriteria加入:
Restrictions.gt(“age”,new Integer(20)),
Restrictions.eq(“sex”,”man”)
)).list();
如果需要关联查询的话,可以使用Criteria的createCriteriaҎ创徏一个CriteriaQ例如部?Department)和h?Person)是一对多的关p,我要查询Person实体里面q龄(age)大于20Q性别 (sex)为manQ?br />
备注包含应届生,
且所在部?department)是开发部的记?
.add(Restrictions.eq(“sex”,”man”))
.add(Restrictions.like(“Memo”,”%应届?/span>%”))
.createCriteria(“department”)
.add(Restrictions.eq(“departmentname”,”开发部”))
.list();
其他条g的用法也很简单,׃列D了?br />
另外QHibernate3Z一个org.hibernate.criterion.DetachedCriteriaQ即ȝCriteriaQ它允许你可以先创徏DetachedCriteriaQ然后传到Session里面才真正返回一个CriteriaQ用法如下:
DetachedCriteria detchedCriteria = DetachedCriteria.forClass(Person.class); // 先徏立DetchedCriteria物g
detchedCriteria.add(Restrictions.ge("age",new Integer(25))); // 加入查询条g
Session session = sessionFactory.openSession();
Criteria criteria = detchedCriteria.getExecutableCriteria(session); // l定Session並返回一个Criteria实例List list = criteria.list();
最后,需要注意,Criteriaq提供了setFirstResult和setMaxResultsҎq行分页查询?br />
]]>
从一个最基本的对象关pL像自动化E序Q了解Hibernatel成的基本元素,q进一步了解Hibernate的基语义、配|等概念?/p>
1QO/R映像入门W一个HibernateE序很简单,一个对象映像至一个数据表
1Q?配置Hibernate
Hibernate是ORM的解x案,其底层对数据库的操作依赖于JDBCQ所以您必须先取得JDBC驱动E序Q在q边所使用的是MySQLQ所以您必须至MySQL®Connector/J取得MySQL的JDBC驱动E序?/p>
接下来至Hibernate官方|站取得hibernate 3.0?/p>
解开zip档案后,当中的hibernate3.jar是必要的Q而在lib目录中还包括了许多jar档案Q您可以在Hibernate 3.0官方的参考手册上扑ֈq些jar的相兌明,其中必要的是antlr、dom4j、CGLIB、asm、Commons Collections、Commons Logging?EHCacheQHibernate底层q需要Java Transaction APIQ所以您q需要jta.jarQ到q边为止Qd需要以下的jar档案Q?/p>
Hibernate可以q行于单Z上,也可以运行于Web应用E序之中Q如果是q行于单机,则将所有用到的jar档案Q包括JDBC驱动E序Q设定至CLASSPATH中,如果是运行于Web应用E序中,则将jar档案|放于WEB-INF/lib中?/p>
如果您还需要额外的LibraryQ再依需求加入,例如JUnit、Proxool{等Q接下来可以etc目录下的log4j.properties复制至Hibernate目的Classpath下,q修改一下当中的log4j.logger.org.hibernate为errorQ也是只在错误发生时显C必要的讯息?/p>
接着讄基本的Hibernate配置文gQ可以用XML或Properties档案Q这边先使用XMLQ档名预设ؓhibernate.cfg.xmlQ?/p>
hibernate.cfg.xml
配置文g中已l加上批注ؓ每一个项目作了说明,其中对象与数据库表格映像文gq有待加入?/p>
1Q?W一个Hibernate
q边以一个简单的单机E序来示范Hibernate的配|与功能Q首先作数据库的准备工作Q在MySQL中新增一个demo数据库,q徏立user表格Q?/p>
CreateUser2MySQL.sql
|
对于q个表格Q您有一个Usercd与之对应Q表g的每一个字D将对应至User实例上的Field成员?/p>
User.java
|
其中id是个Ҏ的属性,Hibernate会用它来作Z键识别,您可以定义主键生的方式Q这是在XML映像文g中完成,Z告诉Hibernate您所定义的User实例如何映像x据库表格Q您撰写一个XML映射文g档名是User.hbm.xmlQ如下所C:
User.hbm.xml
<class>h的name属性ؓ所映像的对象,而table为所映像的表|<id>中column属性指定了表格字段Q而type属性指定了User实例的中的id之型态,q边type中所讑֮的是直接指定Java中的对象型态,Hibernate也定义有自己的映像型态,作ؓJava对象与SQL型态的标准对应型态(因ؓ语言所提供的类型ƈ不一定与数据库的cd对应Q,q之后会再说明?/p>
#p#
<id>中主键的产生方式在这边设定ؓ"native"Q表CZ键的生成方式由HibernateҎ数据库Dialect的定义来军_Q之后还会介l其它主键的生成方式?/p>
同样的,<property>标签中的column与type都各自指明了表格中字D与对象中属性的对应?/p>
接着必须在Hibernate配置文ghibernate.cfg.xml中指明映像文件的位置Q如下加入映像文件位|:
hibernate.cfg.xml
接下来撰写一个测试的E序Q这个程序直接以Java E序设计人员熟悉的语法方式来操作对象Q而实际上也直接完成对数据库的操作Q程序将会将一W数据存入表g中:
FirstHibernate.java
|
如您所看到的,E序中只需要直接操作User 对象Qƈq行Session 与Transaction 的相x作,Hibernate ׃自动完成Ҏ据库的操作,您看不到M一行JDBC 或SQL 的陈qͼ撰写好以上的各个档案之后Q各档案的放|位|如下:
接着可以开始运行程序,l果如下Q?/p>
FirstHibernate执行l果
|
新增资料OK!请先用MySQL 观看l果Q?/p>
执行l果中显CZHibernate 所实际使用的SQLQ由于这个程序还没有查询功能Q所以要
q入MySQL 中看看新增的数据Q如下:
MySQL 中查询结?/strong>
|
Comments
W四D代码的标题应该是hibernate.cfg.xml
1Q? W二?Hibernate
?W一?Hibernate 中介l如何用Hibernate 在不使用SQL 的情况下Q以Java 中操作对象的习惯来插入数据至数据库中Q当然储存数据之后,更重要的是如何将资料dQHibernate 中也可以让您不写一句SQLQ而以Java 中操作对象的习惯来查询数据?/p>
直接来看个范例:
SecondHibernate.java
|
#p#
Criteria 对SQL q行装Q对于不甚了解SQL 的开发h员来_使用Criteria 也可以轻易的q行各种数据的检索,您也可以使用 Expression 讑֮查询条gQƈ之加入Criteria中对查询l果作限ӞExpression.eq()表示讑֮W合条g的查询,例如Expression.eq("name", "caterpillar")表示讑֮查询条g?name"字段中ؓ"caterpillar"的数据?/p>
先来看一下执行结果:
SecondHibernate 执行l果
|
Criteria 是对象导向式的查询方式,让不了解SQL 的开发h员也可以Lq行各项查询Q但Criteria 的API 目前q不是很完善Q而Hibernate 鼓励的查询方式,是透过HQLQHibernate Query LanguageQ来q行Q直接来看个实例Q?/p>
SecondHibernateUsingHQ.java
|
执行l果Q?/p>
SecondHibernateUsingHQ 执行l果
|
透过Query 接口Q您可以先设定查询参敎ͼ之后透过setXXX(){方法,指定的参数值填入,而不用每ơ都撰写完整的HQLQQuery 的setParameter()ҎW一个参数是指定?出现的位|,?0 开始,W二个参数则是设定查询条件?
#p#
二、简单的Hibernate E序
q边以一个简单的单机E序来示范Hibernate的配|与功能Q在q个例子中的一些操作,实际上会使用一些自动化工具来完成,而不一定亲自手动操作设定,q边完全手动的原因,在于让您可以知道Hibernate实际上会作那些动作,在进行范例之前,请先定前一个主题中的相关jar档案都已l设定在CLASSPATH中?br />
我们先作数据库的准备工作Q在MySQL中新增一个HibernateTest数据库,q徏立USER表格Q?
|
我们先撰写一个纯Java对象Q它U綷表示一个数据集合,待会我们会将之映像至数据库的表格上,E序如下Q?
User.java
|
其中id是个Ҏ的属性,Hibernate会用它来作Z键识别,我们可以定义主键产生的方式,q是在XML映像文g中完成,Z告诉Hibernate对象如何映像x据库表格Q我们撰写一个XML映射文g档名是User.hbm.xmlQ如下所C:
User.hbm.xml
q个XML文g定义了对象属性映像至数据库表格的关系Q您可以很简单的了解Ҏ的方法,像是User对象对应至USER表格Q其中我们?uuid.hex来定义主键的产生法QUUID法使用IP地址、JVM的启动时间、系l时间和一个计数值来产生主键。除了用uuid.hex之外Q我们还可以使用其它的方式来产生主键Q像是increment{,q可以在Hibernate参考手册中扑ֈ相关资料?/p>
<property>h用于定义Java对象的属性,而当中的<column/>h用于定义与数据库的对应,如果您是手工建立Java对象与数据库表格Q则在最单的情况下,可以只定?lt;property name="sex"/>q样的方式,而由Hibernate自动判断Java对象属性与数据库表格名U对应关p,?lt; property/>?lt;column/>标签上的额外讑֮Q像是not null、sql-type{)Q则可以用于自动产生Java对象与数据库表格的工具上?/p>
接下来我们定义Hibernate配置文gQ主要是q行SessionFactory配置QHibernate可以使用XML或属性文件来q行配置Q我 们这边先介绍如何使用XML配置Q这也是Hibernate所的配|方式,我们的文件名是hibernate.cfg.xmlQ如下:
hibernate.cfg.xml
接下来我们撰写一个测试的E序Q这个程序将直接以JavaE序设计人员熟悉的语法方式来操作对象Q而实际上也直接完成对数据库的操作Q程序将会将一W数据存入表g中:
HibernateTest.java
|
#p#
Configuration代表了Java对象x据库的映像设定,q个讑֮是从我们上面的XML而来Q接下来我们从Configuration取得SessionFactory对象Qƈ由它来开启一个SessionQ它代表对象与表格的一ơ会话操作,?Transaction则表CZl会话操作,我们只需要直接操作User对象Qƈq行Session与Transaction的相x作, Hibernate׃自动完成Ҏ据库的操作。这边对E序先只作简单的介绍Q之后再详加说明?/p>
所有的.java档案~译Qƈ两个XML档案攄在与HibernateTest相同的目录中Q也是档案位置如下Q?
|
OK!现在您可以执行HibernateTestQ程序将会出C下的讯息Q?
|
新增资料OK!请先用MySQL观看l果Q?/p>
q边只先q行数据的存入,要观看数据存入的l果的话Q请q入MySQL观看Q以下是数据库存入的l果Q?
|
2、源文gQ?/p>
3、配|文ӞMesssage.hbm.xml
4、最后的包结构:
5、测试:
你会发现在数据库中有一条信息了Qid=1
Hibernate的对象识别是通过对象的Id 来识别的Q?br />
如:
Hibernate有很多值得学习的地?q里我们单介l一个HibernateQ重点介lHibernate部vQ希望读者看后受益匪?/p>
一. 什么是hibernateQ?/strong>
{:Hibernate是一个开放源代码的对象关pL框Ӟ它对JDBCq行了非常轻量的对象封装,使得JavaE序员可以随心所Ʋ的使用对象~程思维来操U|据库?Hibernate可以应用在Q何用JDBC的场合,既可以在Java的客LE序使用Q也可以在Servlet/JSP的Web应用中用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMPQ完成数据持久化的重仅R?/p>
? 快速构建?/strong>
在此先要说明一下。由于本人懒惎ͼC住hibernate的配|选项Q所以,此系列的实例都是使用myeclipseq行快速开发。各位对myeclipse不的,p见谅。然后,数据库都是mysql?br />
下面开始利用hibernateq行数据库的讉K?
需求:实现对用L增、删、改、查。ؓ了方便,用户?个属?用户ID和用户名。实体模型如下:
建立工程:HibernateQuickUseQƈ且徏立包。如下:
Ҏ实体Q创建类UserQ代码如下:
- package org.py.hib.quickstart;
- /**
- * User entity.
- * @author MyEclipse Persistence Tools
- */
- @SuppressWarnings("serial")
- public class User implements java.io.Serializable
- {
- private String id;
- private String name;
- public User()
- {
- }
- public String getId()
- {
- return this.id;
- }
- public void setId(String id)
- {
- this.id = id;
- }
- public String getName()
- {
- return this.name;
- }
- public void setName(String name)
- {
- this.name = name;
- }
- }
Ҏhibernate实体Q创建数据表。sql如下Q?/p>
- use HibernateQuickUse;
- drop table if exists User;
- create table user (
- id varchar(32) primary key,
- name varchar(32)
- );
q里的idQ我没有采用Integer auto_increment, 原因是ؓ了数据库的数据能方便的导入到另外一U数据库里面Q比方说Qoracle。当Ӟq个是以牺牲部分效率为前提的。因为id是integer的,能更加快速查询。不q,从数据库会自动ؓ primary key 建立 index来看Q效率也不会相差太多?br /> 要想通过hibernate讉K数据库。首先要建立描述数据库的文gQhibernate.cfg.xml。放到src下面。内容如下:
- xml version='1.0' encoding='UTF-8'?>
- "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
- <hibernate-configuration>
- <session-factory>
- <property name="dialect">org.hibernate.dialect.MySQLDialect< SPAN>property>
- <property name="connection.url">jdbc:mysql://localhost:3306/hibernatequickUse< SPAN>property>
- <property name="connection.username">root< SPAN>property>
- <property name="connection.password">root< SPAN>property>
- <property name="connection.driver_class">com.mysql.jdbc.Driver< SPAN>property>
- <property name="show_sql">true< SPAN>property>
- <mapping resource="org/py/hib/quickstart/User.hbm.xml" />
- < SPAN>session-factory>
- < SPAN>hibernate-configuration>
说说上面?"dialect", q个对应着hibernate生成哪种数据库的sql。然后是Q?show_sql", q个是ؓ了调试时候输出sql语句到屏q用的?/p>
注意"mapping resource"部分。这个部分表CZ?实体- 数据?映射文g的位|。(什么是实体-数据?映射文gQ看下面。)
实体-数据库映文?-- 主要是告诉hibernateQ这个Userc,对应着哪个tableQUserc里面的那个属性对应着table里面的哪个字Dc我们可以徏?实体-数据?的xml映射文gQ也可以采用Annotations映射Q但是目前只说xml映射方式。如下:
- xml version="1.0" encoding="utf-8"?> > <hibernate-mapping> <class name="org.py.hib.quickstart.User" table="user"> <id name="id" type="java.lang.String" column="id" length="32"> <generator class="uuid" /> < SPAN>id> <property name="name" type="java.lang.String" column="name" length="32" /> < SPAN>class> < SPAN>hibernate-mapping>
上面的xmlq是很好理解的。注意一个generator中的classQ他可以有很多。我们这用的是uuid。什么是uuid。这个可以google一下。呵cgoogle是最好的教科书。还能有很多其他的,比方_native。具体的同样hgoogle。有了上面的准备Q那么我们开始来试一下。这里我们用junit。具体怎么使用junitQ呵c答案我惛_安知道了,也不用我说了。其实我对test ?使用它也不熟l?/p>
我把试用力攑ֈ了test/org.py.hib.quickstart下面。代码如下:
- package org.py.hib.quickstart;
- import junit.framework.Assert;
- import junit.framework.TestCase;
- import org.hibernate.Session;
- import org.hibernate.SessionFactory;
- import org.hibernate.Transaction;
- import org.hibernate.cfg.Configuration;
- import org.junit.After;
- import org.junit.Before;
- public class QuickStartTest extends TestCase
- {
- SessionFactory factory;
- String m_name = "ryanpoy";
- String m_name2 = "ryanpoy2";
- @Before
- public void setUp() throws Exception
- {
- Configuration conf = new Configuration().configure();
- factory = conf.buildSessionFactory();
- }
- /**
- * 试d
- * @throws Exception
- */
- public void testSave() throws Exception
- {
- System.out.println("\n=== test save ===");
- User u = new User();
- u.setName(m_name); // 讄用户?nbsp;= m_name
- Session session = null;
- Transaction tran = null;
- try
- {
- session = factory.openSession();
- tran = session.beginTransaction();
- session.save(u);
- tran.commit();
- Assert.assertEquals(u.getId() != null, true);
- } catch (Exception ex)
- {
- tran.rollback();
- throw ex;
- } finally
- {
- if (session != null)
- {
- try
- {
- session.close();
- } catch (Exception ex)
- {
- // nothing to do
- } finally
- {
- if (session != null)
- session = null;
- }
- }
- }
- }
- /**
- * 试查询
- * @throws Exception
- */
- public void testFind() throws Exception
- {
- System.out.println("\n=== test find ===");
- Session session = null;
- try
- {
- session = factory.openSession();
- User u = (User) session.createQuery("from User").list().get(0);
- Assert.assertEquals(true, u.getId() != null);
- Assert.assertEquals(m_name, u.getName());
- } catch (Exception ex)
- {
- throw ex;
- } finally
- {
- if (session != null)
- {
- try
- {
- session.close();
- } catch (Exception ex)
- {
- // nothing to do
- } finally
- {
- if (session != null)
- session = null;
- }
- }
- }
- }
- /**
- * 试修改
- * @throws Exception
- */
- public void testModify() throws Exception
- {
- System.out.println("\n=== test modify ===");
- Session session = null;
- Transaction tran = null;
- try
- {
- session = factory.openSession();
- tran = session.beginTransaction();
- User u = (User) session.createQuery("from User").list().get(0);
- u.setName(m_name2); // 修改用户?nbsp;= m_name2.Q原来用户名= m_nameQ?
- tran.commit();
- } catch (Exception ex)
- {
- throw ex;
- } finally
- {
- if (session != null)
- {
- try
- {
- session.close();
- } catch (Exception ex)
- {
- // nothing to do
- } finally
- {
- if (session != null)
- session = null;
- }
- }
- }
- /*
- * 修改后再查询
- */
- System.out.println("\n=== test find after modify ===");
- try
- {
- session = factory.openSession();
- User u = (User) session.createQuery("from User").list().get(0);
- Assert.assertEquals(true, u.getId() != null);
- Assert.assertEquals(m_name2, u.getName());
- } catch (Exception ex)
- {
- throw ex;
- } finally
- {
- if (session != null)
- {
- try
- {
- session.close();
- } catch (Exception ex)
- {
- // nothing to do
- } finally
- {
- if (session != null)
- session = null;
- }
- }
- }
- }
- /**
- * 试删除
- * @throws Exception
- */
- public void testDelete() throws Exception
- {
- System.out.println("\n=== test delete ===");
- Session session = null;
- Transaction tran = null;
- try
- {
- session = factory.openSession();
- tran = session.beginTransaction();
- User u = (User) session.createQuery("from User").list().get(0);
- session.delete(u);
- tran.commit();
- } catch (Exception ex)
- {
- throw ex;
- } finally
- {
- if (session != null)
- {
- try
- {
- session.close();
- } catch (Exception ex)
- {
- // nothing to do
- } finally
- {
- if (session != null)
- session = null;
- }
- }
- }
- /*
- * 删除后再查询
- */
- System.out.println("\n=== test find after delete ===");
- try
- {
- session = factory.openSession();
- Integer num = (Integer) session.createQuery("from User").list().size();
- Assert.assertEquals(0, num.intValue());
- } catch (Exception ex)
- {
- throw ex;
- } finally
- {
- if (session != null)
- {
- try
- {
- session.close();
- } catch (Exception ex)
- {
- // nothing to do
- } finally
- {
- if (session != null)
- session = null;
- }
- }
- }
- }
- /**
- *
- */
- @After
- public void tearDown() throws Exception
- {
- factory.close();
- }
- }
q行后,我们很欣慰的看到一路绿灯,全部通过了。那么测试没有问题。呵?q里的测试可能还不完善。请大家指出。前面说q,我对试q块也不??br /> 看控制台Q会输出如下信息Q?/p>
- === test save ===
- Hibernate: insert into hibernatequickuse.user (name, id) values (?, ?)
- === test find ===
- Hibernate: select user0_.id as id2_, user0_.name as name2_ from hibernatequickuse.user user0_
- === test modify ===
- Hibernate: select user0_.id as id4_, user0_.name as name4_ from hibernatequickuse.user user0_
- Hibernate: update hibernatequickuse.user set name=? where id=?
- === test find after modify ===
- Hibernate: select user0_.id as id4_, user0_.name as name4_ from hibernatequickuse.user user0_
- === test delete ===
- Hibernate: select user0_.id as id6_, user0_.name as name6_ from hibernatequickuse.user user0_
- Hibernate: delete from hibernatequickuse.user where id=?
- === test find after delete ===
- Hibernate: select user0_.id as id6_, user0_.name as name6_ from hibernatequickuse.user user0_
Hibernate有很多值得学习的地方,q里我们主要介绍Hibernate SequenceQ包括介lOracle sequence{方面?
一、ؓ表创增长自段有两U?/strong>
一U是不同的表使用各自的Hibernate SequenceQ方法如下:
1、在Oracle sequence首先创徏sequence create sequence seq_idminvalue 1start with 1increment by 1cache 20Q?br />
2.在你的hbm.xml中的配置seq_id
q样再插入数据的时候,Hibernate会自动生成如下语句:
hibernateQ?select seq_id.nextval from dual hibernateQ?insert into YXJK.T_YXJK_WHRYTXL QXM0000Q?ZW0000Q?LXDH00Q?SJHM00Q?DZYJ00QIP0000Q?ID0000Q?values Q?Q?Q, Q, Q, Q, Q, Q)
自动生成下一个序列|然后对象插入表中。在使用的时候需要注意,Hibernate对于sequence的主键的要求是一定要是shorQlongQ或者integer.
?q有一U方式是使用公共的sequence
q各时候可以不指定表用的sequenceQ那么相应的hbm.xml中内ҎQ?/p>
然后创徏公用的Hibernate sequence对象Q命名ؓ hibernate_sequence
◆create sequence hibernate_sequence
◆minvalue 0
◆maxvalue 99999999
◆start with 10000
◆increment by 1Q?/p>
?注意事项
如果数据库是从sqlserver{其他数据库UL而来的,那么创徏sequence时的起始值应该比当前表中最大的ID值大Q否则会出现错误Q因为sequence 不会l护是否和导库前现有的值重复?br /> 1、sequenceQ用于Oracle数据?br /> 2、nativeQ跨数据库时使用Q由底层方言产生?/p>
Default.sequence为hibernate_sequence
注:使用native时Hibernate默认会去查找Oracle中的hibernate_sequence序列。如果Oracle中没有该序列Q连Oracle数据库时会报错?/p>