您的位置:首页 > 其它

Hibernate开发之创建POJO-配置文件-映射文件

2016-03-24 10:51 405 查看
目录:

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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: