目錄:
1、確定已在oracle數據庫中建表
1.1、查詢表1.2、刪除表中已有記錄
1.3、確定已有sequence
2、創建java project工程創建class Student
2.1 添加jar包:ojdbc6.jar,以及...\hibernate-release-5.1.0.Final\lib\required下的所有jar包
3、創建hibernate.cfg.xml4、創建POJO對應的映射文件*.hbm.xml
5、創建Configuration對象,讀取hibernate.cfg.xml
詳細如下:
1、確定已在oracle數據庫中建表
1.1、查詢表
SQL*Plus: Release 11.2.0.2.0 Production on 星期四 3月 24 09:41:08 2016
Copyright (c) 1982, 2014, Oracle. All rights reserved.
SQL> conn zhaod
輸入口令:
已連接。
SQL> desc student;
名稱 是否爲空? 類型
----------------------------------------- -------- ----------------------------
ID NOT NULL NUMBER(10)
NAME NOT NULL VARCHAR2(20)
ADDRESS VARCHAR2(20)
GENDER VARCHAR2(20)
AGE NUMBER(3)
1.2、刪除表中已有記錄
SQL> delete from student;
已刪除0行。
SQL> commit;
提交完成。
SQL>
1.3、確定已有sequence
SQL> col sequence_name format a20;
SQL> select sequence_name,min_value,max_value from all_sequences;
SEQUENCE_NAME MIN_VALUE MAX_VALUE
-------------------- ---------- ----------
SCHEDULER$_JOBSUFFIX 1 1.0000E+28
_S
DM$EXPIMP_ID_SEQ 1 1.0000E+28
HS_BULK_SEQ 1 1.0000E+28
XDB$NAMESUFF_SEQ 1 99999
SDO_IDX_TAB_SEQUENCE 1 1.0000E+27
TMP_COORD_OPS 1000000 2000000
SAMPLE_SEQ 1 1.0000E+28
WWV_FLOW_SESSION_SEQ 1 1.0000E+28
WWV_SEQ 1 1.0000E+28
SEQUENCE_NAME MIN_VALUE MAX_VALUE
2、創建java project工程
創建class Stident
package com.iotek.basic.pojo;
import java.io.Serializable;
public class Student implements Serializable {
private Long id;
private String name;
private String address;
private String gender;
private Integer age;
public Student() {
super();
}
public Student(Long id, String name, String address, String gender, Integer age) {
super();
this.id = id;
this.name = name;
this.address = address;
this.gender = gender;
this.age = age;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
3、創建hibernate.cfg.xml
與oracle對應的該工程配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
<property name="connection.url">jdbc:oracle:thin:@localhost:1521:XE</property>
<property name="connection.username">zhaod</property>
<property name="connection.password">zhaodeng</property>
<!-- SQL dialect -->
<property name="dialect">org.hibernate.dialect.Oracle10gDialect</property>
<!-- Echo all executed SQL to stdout -->
<property name="show_sql">true</property>
</session-factory>
</hibernate-configuration>
這裏應注意加上一行
<mapping resource="com/iotek/basic/pojo//Student.hbm.xml"/>
否則會出現Unknown entity 錯誤(汗)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="connection.driver_class">org.h2.Driver</property> <!-- 驅動 -->
<property name="connection.url">jdbc:h2:target/db/hibernate-spatial;mode=PostgreSQL;DB_CLOSE_DELAY=-1</property><!-- url -->
<property name="connection.username">sa</property> <!-- 用戶名 -->
<property name="connection.password"></property> <!-- 密碼 -->
<!-- JDBC connection pool (use the built-in) 連接池-->
<property name="connection.pool_size">1</property>
<!-- SQL dialect 方言:實現hibernate與不同數據庫的連接-->
<property name="dialect">org.hibernate.dialect.H2Dialect</property>
<!-- Enable Hibernate's automatic session context management -->
<property name="current_session_context_class">thread</property>
<!-- Disable the second-level cache -->
<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
<!-- Echo all executed SQL to stdout -->
<property name="show_sql">true</property>
<!-- Drop and re-create the database schema on startup -->
<property name="hbm2ddl.auto">update</property>
<property name="hibernate.search.default.directory_provider">filesystem</property>
<property name="hibernate.search.default.indexBase">target/indexes</property>
<mapping class="org.hibernate.search.test.spatial.POI"/>
</session-factory>
</hibernate-configuration>
4、創建POJO對應的映射文件*.hbm.xml
一個POJO對應一個映射文件
Student.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.iotek.basic.pojo">
<class name="Student" table="STUDENT">
<id name="id" column="ID" type="long">
<generator class="sequence">
<param name="sequence">student_seq</param>
</generator>
</id>
<property name="name" type="string" column="NAME"/>
<property name="address" type="string" column="ADDRESS"/>
<property name="gender" type="string" column="GENDER"/>
<property name="age" type="int" column="AGE"/>
</class>
</hibernate-mapping>
後問題就出在這裏(問題爲:ORA-02289: 序列不存在),應改爲:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.iotek.basic.pojo">
<class name="Student" table="STUDENT">
<id name="id" column="ID" type="long">
<generator class="increment">
<param name="sequence">student_seq</param>
</generator>
</id>
<property name="name" type="string" column="NAME"/>
<property name="address" type="string" column="ADDRESS"/>
<property name="gender" type="string" column="GENDER"/>
<property name="age" type="int" column="AGE"/>
</class>
</hibernate-mapping>
即,將generator的sequence改爲increment(適用所有數據庫)
注:<generator>表示一個主鍵的生成機制。即具體通過何種方式來生成。 生成方式包括: increment:生成long, short或者int類型的主鍵,不能在cluster環境下使用。適用於所有數據庫 identity:生成long, short或者int類型的主鍵。適用於DB2, MySQL, MS SQL Server, Sybase and HypersonicSQL sequence :生成long, short或者int類型的主鍵。適用於DB2, PostgreSQL, Oracle, SAP DB, McKoi,Interbase. hilo:生成long, short或者int類型的主鍵。需要提供一個數據庫的表來存放生成的主鍵信息。當採用應用服務器的JTA提供的數據庫連接或者用戶自定義的數據庫連接的時候,不要使用這種主鍵生成方式。適用於所有數據庫 seqhilo:採用給定的數據庫的sequence來生成long, short或者int類型的主鍵。適用於DB2, PostgreSQL, Oracle, SAP DB, McKoi,Interbase. uuid.hex:採用128位的算法來生成一個32位字符串。最通用的一種方式。適用於所有數據庫 uuid.string:同樣採用128位的UUID算法。將生成的字符編碼位16位。適用於除PostgreSQL.以外的數據庫 native:根據具體連接的數據庫從identity, sequence或者hilo選擇一種來生成主鍵。適用的數據庫根據選擇的生成方式確定。 assigned: 交給應用自己給主鍵賦值。要注意的是賦值必須在調用save()方法之前完成。適用的數據庫根據選擇的生成方式確定。
5、創建Configuration對象,讀取hibernate.cfg.xml
package com.iotek.basic;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.Transaction;
import com.iotek.basic.pojo.Student;
public class StudentTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
Student stu = new Student();
stu.setName("zhaox");
stu.setAddress("beijing");
stu.setGender("female");
stu.setAge(18);
// 創建Configuration,讀取hibernate.cfg.xml
Configuration config = new Configuration();
config.configure("hibernate.cfg.xml");
// 創建SessionFactory
SessionFactory factory = config.buildSessionFactory();
// 創建Session,獲取數據庫連接
Session session = factory.openSession();
// 通過session完成數據庫的CRUD()
Transaction trans = null;
try {
// 啓動事務
trans = session.beginTransaction();
// 保存學生對象
session.save(stu);
// 提交事務
trans.commit();
} catch (Exception e) {
e.printStackTrace();
// 回滾事務
trans.rollback();
} finally {
// 關閉session,即爲關閉connection
session.close();
}
}
}
運行結果爲:
SQL> col sequence_name format a20;
SQL> select * from student;
ID NAME
---------- ----------------------------------------
ADDRESS
----------------------------------------
GENDER AGE
---------------------------------------- ----------
1 zhaox
beijing
female 18
SQL>