Hibernate開發之創建POJO-配置文件-映射文件

目錄:

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.xml

4、創建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>













發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章