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>













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