一、Hibernate必须包(3.2)
hibernate3.jar:Hibernate的核心库
cglib-2.1.3.jar:Hibernate用它来实现PO字节码的动态生成,非常核心的库
asm.jar:cglib所使用的库
asm-attrs.jar:cglib所使用的库
dom4j-1.6.1.jar:Hibernate用它来读写配置文件
commons-logging-1.0.4.jar:用于日志管理
commons-collections-2.1.1.jar:包含了一些Apache开发的集合类,功能比java.util.*强大
antlr-2.7.6.jar:是语法分析生成器
二、配置hibernate.cfg.xml
- <?xml version='1.0' encoding='UTF-8'?>
- <!DOCTYPE hibernate-configuration PUBLIC
- "-//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
- </property>
- <property name="connection.url">
- jdbc:mysql://localhost:3306/jpa?useUnicode=true&characterEncoding=UTF-8
- </property>
- <property name="connection.username">root</property>
- <property name="connection.password">root</property>
- <property name="connection.driver_class">
- com.mysql.jdbc.Driver
- </property>
- <!-- hibernate属性 -->
- <!-- 是否显示执行的sql语句 -->
- <property name="show_sql">true</property>
- <!-- 显示执行的sql语句是否格式化 -->
- <property name="format_sql">true</property>
- <!-- 根据配置文件创建表 -->
- <property name="hbm2ddl.auto">update</property>
- <mapping resource="com/tao/hibernate/Student.hbm.xml"/>
- </session-factory>
- </hibernate-configuration>
<?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//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 </property> <property name="connection.url"> jdbc:mysql://localhost:3306/jpa?useUnicode=true&characterEncoding=UTF-8 </property> <property name="connection.username">root</property> <property name="connection.password">root</property> <property name="connection.driver_class"> com.mysql.jdbc.Driver </property> <!-- hibernate属性 --> <!-- 是否显示执行的sql语句 --> <property name="show_sql">true</property> <!-- 显示执行的sql语句是否格式化 --> <property name="format_sql">true</property> <!-- 根据配置文件创建表 --> <property name="hbm2ddl.auto">update</property> <mapping resource="com/tao/hibernate/Student.hbm.xml"/> </session-factory> </hibernate-configuration>
三、配置ORM映射
1.创建java类
- package com.tao.hibernate;
- import java.io.Serializable;
- @SuppressWarnings("serial")
- public class Student implements Serializable {
- private Integer id;
- private String name;
- public Student() {
- super();
- }
- public Integer getId() {
- return id;
- }
- public void setId(Integer id) {
- this.id = id;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- }
package com.tao.hibernate; import java.io.Serializable; @SuppressWarnings("serial") public class Student implements Serializable { private Integer id; private String name; public Student() { super(); } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
2.配置表映射文件
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
- <hibernate-mapping>
- <class name="com.tao.hibernate.Student" table="student" schema="jpa">
- <id name="id" type="java.lang.Integer" column="id">
- <generator class="identity" />
- </id>
- <property name="name" type="java.lang.String">
- <column name="name" length="16" />
- </property>
- </class>
- </hibernate-mapping>
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.tao.hibernate.Student" table="student" schema="jpa"> <id name="id" type="java.lang.Integer" column="id"> <generator class="identity" /> </id> <property name="name" type="java.lang.String"> <column name="name" length="16" /> </property> </class> </hibernate-mapping>
注:映射文件已经在二中加入了。如果没有加入,自己手动加入。
四、数据操作类
- package com.tao.hibernate;
- import java.util.List;
- import org.hibernate.Query;
- import org.hibernate.Session;
- import org.hibernate.SessionFactory;
- import org.hibernate.Transaction;
- import org.hibernate.cfg.Configuration;
- publicclass StudentDAO {
- private Session session = null;
- public StudentDAO() {
- //创建一个Configuration对象,此时Hibernate会默认加载classpath中的配置文件hibernate.properties
- //<span style="color: rgb(0, 0, 0); font-size: x-small;">configura()方法:用于告诉Hibernate加载hibernate.cfg.xml文件。</span>
- Configuration config = new Configuration().configure();
- SessionFactory factory = config.buildSessionFactory();
- session = factory.openSession();
- }
- publicvoid save(Student student) {
- Transaction tran = session.getTransaction();
- tran.begin();
- session.save(student);
- tran.commit();
- }
- publicvoid update(Student student) {
- Transaction tran = session.beginTransaction();
- tran.begin();
- session.update(student);
- tran.commit();
- }
- publicvoid delete(Integer id) {
- String hql = "delete from Student o where o.id = ?";
- Transaction tran = session.beginTransaction();
- tran.begin();
- Query query = session.createQuery(hql);
- query.setParameter(0, id);
- query.executeUpdate();
- tran.commit();
- }
- @SuppressWarnings("unchecked")
- public Student getModel(Integer id) {
- String hql = "from Student o where id = :id";
- Query query = session.createQuery(hql);
- query.setParameter("id", id);
- List list = query.list();
- if (list != null && list.size() == 1) {
- return (Student) list.get(0);
- } else {
- returnnull;
- }
- }
- @SuppressWarnings("unchecked")
- public List getPagination(int maxResults, int firstResult) {
- String hql = "from Student o";
- Query query = session.createQuery(hql);
- query.setFirstResult(firstResult);
- query.setMaxResults(maxResults);
- return query.list();
- }
- }
package com.tao.hibernate;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
public class StudentDAO {
private Session session = null;
public StudentDAO() {
//创建一个Configuration对象,此时Hibernate会默认加载classpath中的配置文件hibernate.properties
//configura()方法:用于告诉Hibernate加载hibernate.cfg.xml文件。
Configuration config = new Configuration().configure();
SessionFactory factory = config.buildSessionFactory();
session = factory.openSession();
}
public void save(Student student) {
Transaction tran = session.getTransaction();
tran.begin();
session.save(student);
tran.commit();
}
public void update(Student student) {
Transaction tran = session.beginTransaction();
tran.begin();
session.update(student);
tran.commit();
}
public void delete(Integer id) {
String hql = "delete from Student o where o.id = ?";
Transaction tran = session.beginTransaction();
tran.begin();
Query query = session.createQuery(hql);
query.setParameter(0, id);
query.executeUpdate();
tran.commit();
}
@SuppressWarnings("unchecked")
public Student getModel(Integer id) {
String hql = "from Student o where id = :id";
Query query = session.createQuery(hql);
query.setParameter("id", id);
List list = query.list();
if (list != null && list.size() == 1) {
return (Student) list.get(0);
} else {
return null;
}
}
@SuppressWarnings("unchecked")
public List getPagination(int maxResults, int firstResult) {
String hql = "from Student o";
Query query = session.createQuery(hql);
query.setFirstResult(firstResult);
query.setMaxResults(maxResults);
return query.list();
}
}
五、测试代码类
- package com.tao.hibernate;
- import java.util.List;
- publicclass Test {
- @SuppressWarnings("unchecked")
- publicstaticvoid main(String[] args) {
- StudentDAO dao = new StudentDAO();
- // 添加
- // for (int i = 0; i < 10; i++) {
- // Student student = new Student();
- // student.setName("Tao" + i);
- // dao.save(student);
- // }
- // 删除
- // dao.delete(2);
- // 修改
- // Student student = new Student();
- // student.setId(4);
- // dao.update(student);
- // 单个查询
- // Student s = dao.getModel(4);
- // System.out.println(s.getName());
- // 分布查询
- List list = dao.getPagination(4, 1);
- for (int i = 0; i < list.size(); i++) {
- Student std = (Student) list.get(i);
- System.out.println(std.getName());
- }
- }
- }
Hibernate SQL方言 (hibernate.dialect)
如果出现如下错误,则可能是Hibernate SQL方言 (hibernate.dialect)设置不正确。
Caused by: java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC][SQLServer]'last_insert_id' 不是可以识别的 函数名。
DB2 | org.hibernate.dialect.DB2Dialect |
DB2 AS/400 | org.hibernate.dialect.DB2400Dialect |
DB2 OS390 | org.hibernate.dialect.DB2390Dialect |
PostgreSQL | org.hibernate.dialect.PostgreSQLDialect |
MySQL | org.hibernate.dialect.MySQLDialect |
MySQL with InnoDB | org.hibernate.dialect.MySQLInnoDBDialect |
MySQL with MyISAM | org.hibernate.dialect.MySQLMyISAMDialect |
Oracle (any version) | org.hibernate.dialect.OracleDialect |
Oracle 9i/10g | org.hibernate.dialect.Oracle9Dialect |
Sybase | org.hibernate.dialect.SybaseDialect |
Sybase Anywhere | org.hibernate.dialect.SybaseAnywhereDialect |
Microsoft SQL Server | org.hibernate.dialect.SQLServerDialect |
SAP DB | org.hibernate.dialect.SAPDBDialect |
Informix | org.hibernate.dialect.InformixDialect |
HypersonicSQL | org.hibernate.dialect.HSQLDialect |
Ingres | org.hibernate.dialect.IngresDialect |
Progress | org.hibernate.dialect.ProgressDialect |
Mckoi SQL | org.hibernate.dialect.MckoiDialect |
Interbase | org.hibernate.dialect.InterbaseDialect |
Pointbase | org.hibernate.dialect.PointbaseDialect |
FrontBase | org.hibernate.dialect.FrontbaseDialect |
Firebird | org.hibernate.dialect.FirebirdDialect |
HiberNate的基本映射
实体类--表
实体类中的普通属性--表字段
采用<class>标签映射数据库表,通过<porperty>标签将普通属性映射成表字段。
所谓普通属性指不包括自定义类、集合、数组等。
注意:如果实体类和实体类的属性和SQL中的关键字重复,必须使用table或column重新命名。
实体类的设计原则:
(1):实现一个默认的(即无参数的)构造方法(constructor)
(2):提供一个标识属性(identifier property)(可选)
(3): 使用非final的类 (可选)
(4):为持久化字段声明访问器(accessors)和是否可变的标志(mutators)(可选)
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
- <hibernate-mapping package="com.tao.hibernate">
- <class name="Student" table="student" schema="jpa">
- <id name="id" type="java.lang.Integer" column="id">
- <generator class="native" />
- </id>
- <property name="name" type="java.lang.String">
- <column name="name" length="16" />
- </property>
- </class>
- </hibernate-mapping>
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.tao.hibernate"> <class name="Student" table="student" schema="jpa"> <id name="id" type="java.lang.Integer" column="id"> <generator class="native" /> </id> <property name="name" type="java.lang.String"> <column name="name" length="16" /> </property> </class> </hibernate-mapping>
详细介绍:
一:<hibernate-mapping>标签:
- <hibernate-mapping
- auto-import="true|false"
- package="package.name"
- />
<hibernate-mapping auto-import="true|false" package="package.name" />
(1):package (可选): 指定一个包前缀,如果在映射文档中没有指定全限定的类名, 就使用这个作为包名。
(2):auto-import(可选 - 默认为 true):指定我们是否可以在查询语言中使用非全限定的类名(仅限于本映射文件中的类)。
二:<class>标签:
- <class
- name="ClassName"
- table="tableName"
- dynamic-update="true|false"
- dynamic-insert="true|false"
- lazy="true|false"
- />
<class name="ClassName" table="tableName" dynamic-update="true|false" dynamic-insert="true|false" lazy="true|false" />
(1):name (可选): 持久化类(或者接口)的Java全限定名。 如果这个属性不存在,Hibernate将假定这是一个非POJO的实体映射。
(2):table (可选 - 默认是类的非全限定名): 对应的数据库表名。
(3):dynamic-update (可选, 默认为 false): 指定用于UPDATE的SQL将会在运行时动态生成,并且只更新那些改变过的字段。
(4):dynamic-insert (可选, 默认为 false): 指定用于INSERT的 SQL 将会在运行时动态生成,并且只包含那些非空值字段。
(5):lazy (可选): 通过设置lazy="false", 所有的延迟加载(Lazy fetching)功能将被全部禁用(disabled)。
三:<id>标签:
- <id
- name="propertyName"
- type="typename"
- column="column_name"
- <generator class="generatorClass"/>
- </id>
<id name="propertyName" type="typename" column="column_name" <generator class="generatorClass"/> </id>
(1):name (可选): 标识属性的名字。
(2):type (可选): 标识Hibernate类型的名字。
(3):column (可选 - 默认为属性名): 主键字段的名字。
四:<generator>标签:
- <id name="id" type="long"column="cat_id">
- <generator class="org.hibernate.id.TableHiLoGenerator">
- <param name="table">uid_table</param>
- <param name="column">next_hi_value_column</param>
- </generator>
- </id>
<id name="id" type="long" column="cat_id"> <generator class="org.hibernate.id.TableHiLoGenerator"> <param name="table">uid_table</param> <param name="column">next_hi_value_column</param> </generator> </id>
(1):class:主键生成器的名称,Hibernate提供了很多内置的实现:
a.increment:用于为long, short或者int类型生成 唯一标识。只有在没有其他进程往同一张表中插入数据时才能使用。 在集群下不要使用。
b.identity:
对DB2,MySQL, MS SQL Server, Sybase和HypersonicSQL的内置标识字段提供支持。 返回的标识符是long, short或者int类型的。
c.sequence:
在DB2,PostgreSQL, Oracle, SAP DB, McKoi中使用序列(sequence), 而在Interbase中使用生成器(generator)。返回的标识符是long, short或者 int类型的。
d.uuid:
用一个128-bit的UUID算法生成字符串类型的标识符, 这在一个网络中是唯一的(使用了IP地址)。UUID被编码为一个32位16进制数字的字符串。
e.hilo:
使用一个高/低位算法高效的生成long, short或者 int类型的标识符。给定一个表和字段(默认分别是 hibernate_unique_key和next_hi)作为高位值的来源。 高/低位算法生成的标识符只在一个特定的数据库中是唯一的。
f.native:
根据底层数据库的能力选择identity, sequence或者hilo中的一个。
g.assigned:让应用程序在save()之前为对象分配一个标示符。这是 <generator>元素没有指定时的默认生成策略。
(2):param:生成器实例需要某些配置值或者初始化参数, 用<param>元素来传递
五:<property>标签:
- <property
- name="propertyName"
- column="column_name"
- type="typename"
- update="true|false"
- insert="true|false"
- lazy="true|false"
- unique="true|false"
- not-null="true|false"
- length="L"
- />
<property name="propertyName" column="column_name" type="typename" update="true|false" insert="true|false" lazy="true|false" unique="true|false" not-null="true|false" length="L" />
(1):name: 属性的名字,以小写字母开头。
(2):column (可选 - 默认为属性名字): 对应的数据库字段名。 也可以通过嵌套的<column>元素指定。
(3):type (可选): 一个Hibernate类型的名字。
(4):update, insert (可选 - 默认为 true) : 表明用于UPDATE和/或 INSERT的SQL语句中是否包含这个被映射了的字段。这二者如果都设置为false则表明这是一个“外源性(derived)”的属性,它的值来源于映射到同一个(或多个) 字段的某些其他属性,或者通过一个trigger(触发器)或其他程序生成
(5):lazy (可选 - 默认为 false): 指定 指定实例变量第一次被访问时,这个属性是否延迟抓取(fetched lazily)( 需要运行时字节码增强)。
(6):unique (可选): 使用DDL为该字段添加唯一的约束。 同样,允许它作为property-ref引用的目标。
(7):not-null (可选): 使用DDL为该字段添加可否为空(nullability)的约束。
(8):length (可选): 使用DDL为该字段指定长度。
- <?xml version="1.0"?>
- <!DOCTYPE hibernate-mapping PUBLIC
- "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
- <hibernate-mapping>
- <class name="com.bjsxt.hibernate.FiscalYearPeriod" table="t_fiscal_year_period">
- <composite-id name="fiscalYearPeriodPK">
- <key-property name="fiscalYear"/>
- <key-property name="fiscalPeriod"/>
- </composite-id>
- <property name="beginDate"/>
- <property name="endDate"/>
- <property name="periodSts"/>
- </class>
- </hibernate-mapping>
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.bjsxt.hibernate.FiscalYearPeriod" table="t_fiscal_year_period"> <composite-id name="fiscalYearPeriodPK"> <key-property name="fiscalYear"/> <key-property name="fiscalPeriod"/> </composite-id> <property name="beginDate"/> <property name="endDate"/> <property name="periodSts"/> </class> </hibernate-mapping>
- <?xml version="1.0"?>
- <!DOCTYPE hibernate-mapping PUBLIC
- "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
- <hibernate-mapping>
- <class name="com.bjsxt.hibernate.User" table="t_user">
- <id name="id">
- <generator class="native"/>
- </id>
- <property name="name"/>
- <component name="contact">
- <property name="email"/>
- <property name="address"/>
- <property name="zipCode"/>
- <property name="contactTel"/>
- </component>
- </class>
- </hibernate-mapping>