标签:
一个Hibernate应用最基本的文件结构如下:
#1准备maven文件
pom.xml里面定义了项目的依赖jar以及项目的编译打包选项;依赖jar至少需要包含Hibernate的核心库(hibernate-core),第三方数据库连接池管理库(c3p0)和mysql的连接驱动(mysql-connector-java)
文件内容如下:
1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 2 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 3 4 <modelVersion>4.0.0</modelVersion> 5 6 <groupId>org.hibernate.tutorial.test</groupId> 7 <artifactId>HibernateProject</artifactId> 8 <version>1.0.0-SNAPSHOT</version> 9 <name>First Hibernate Tutorial</name> 10 11 <build> 12 <!-- we dont want the version to be part of the generated war file name --> 13 <finalName>${artifactId}</finalName> 14 </build> 15 16 <dependencies> 17 <dependency> 18 <groupId>org.hibernate</groupId> 19 <artifactId>hibernate-core</artifactId> 20 <version>4.3.10.Final</version> 21 </dependency> 22 23 <dependency> 24 <groupId>c3p0</groupId> 25 <artifactId>c3p0</artifactId> 26 <version>0.9.1.2</version> 27 </dependency> 28 29 <dependency> 30 <groupId>mysql</groupId> 31 <artifactId>mysql-connector-java</artifactId> 32 <version>5.0.8</version> 33 </dependency> 34 35 <!-- Because this is a web app, we also have a dependency on the servlet 36 api. --> 37 <dependency> 38 <groupId>javax.servlet</groupId> 39 <artifactId>servlet-api</artifactId> 40 <version>2.5</version> 41 </dependency> 42 43 <!-- Hibernate uses slf4j for logging, for our purposes here use the simple 44 backend --> 45 <dependency> 46 <groupId>org.slf4j</groupId> 47 <artifactId>slf4j-simple</artifactId> 48 <version>1.5.2</version> 49 </dependency> 50 51 <dependency> 52 <groupId>javassist</groupId> 53 <artifactId>javassist</artifactId> 54 <version>3.12.0.GA</version> 55 </dependency> 56 57 <dependency> 58 <groupId>commons-collections</groupId> 59 <artifactId>commons-collections</artifactId> 60 <version>3.1</version> 61 </dependency> 62 </dependencies> 63 64 </project>
#2准备数据库
安装mysql数据库,并创建数据库表User。
创建指令如下:
1 drop database if exists SAMPLEDB; 2 create database SAMPLEDB; 3 use SAMPLEDB; 4 5 create table USER ( 6 ID bigint not null, 7 USER_NAME varchar(20), 8 CREATED_BY varchar(20), 9 CREATED_DATE date, 10 primary key (ID) 11 );
#3准备POJO文件
POJO对应需要进行持久化的对象, Hibernate要求POJO的类定义中必须有一个no-argument的构造方法便于Reflection机制(java.lang.reflect.Constructor.newInstance())。
Hibernate不强制要求每一个属性都有setter和getter,但一旦有则要保证其方法名满足命名规范,否则抛出异常;如果没有则Hibernate也可访问POJO的所有属性,不管是否有getter也不管属性的访问限制符是否为private,访问限制符仅仅是提供给程序其他模块的访问接口;
Hibernate也不要求每一个POJO必须实现Serializable接口,但如果对采用RMI和J2EE分布式结构的应用,POJO在不同进程节点之间传输时,或者在HttpSession内,则一定需要实现此接口;
文件内容如下:
1 package org.hibernate.tutorial.domain; 2 3 import java.util.Date; 4 5 public class User implements java.io.Serializable { 6 7 private int ID; 8 private String userName; 9 private String createdBy; 10 private Date createdDate; 11 12 public User() { 13 } 14 15 public User(int userId) { 16 this.ID = userId; 17 } 18 19 public User(int userId, String userName, String createdBy, 20 Date createdDate) { 21 this.ID = userId; 22 this.userName = userName; 23 this.createdBy = createdBy; 24 this.createdDate = createdDate; 25 } 26 27 public int getUserId() { 28 return this.ID; 29 } 30 31 /** 32 * User ID has no business meaning, so there is no way you should rewrite it. 33 * */ 34 private void setUserId(int userId) { 35 this.ID = userId; 36 } 37 38 public String getUserName() { 39 return this.userName; 40 } 41 42 public void setUserName(String userName) { 43 this.userName = userName; 44 } 45 46 public String getCreatedBy() { 47 return this.createdBy; 48 } 49 50 public void setCreatedBy(String createdBy) { 51 this.createdBy = createdBy; 52 } 53 54 public Date getCreatedDate() { 55 return this.createdDate; 56 } 57 58 public void setCreatedDate(Date createdDate) { 59 this.createdDate = createdDate; 60 } 61 62 }
同时还需要准备Hibernate核心接口SessionFactory和Session;一旦SessionFactory创建之后,则任何Configuration之后的任何配置变化都不再会关联到SessionFactory上。
文件内容如下:
1 package org.hibernate.tutorial.util; 2 3 import org.hibernate.SessionFactory; 4 import org.hibernate.cfg.Configuration; 5 6 public class DBUtils { 7 8 private static final SessionFactory sessionFactory = buildSessionFactory(); 9 10 @SuppressWarnings("deprecation") 11 private static SessionFactory buildSessionFactory() { 12 try { 13 // Create the SessionFactory from hibernate.cfg.xml 14 return new Configuration().configure().buildSessionFactory(); 15 } catch (Throwable ex) { 16 // Make sure you log the exception, as it might be swallowed 17 System.err.println("Initial SessionFactory creation failed." + ex); 18 throw new ExceptionInInitializerError(ex); 19 } 20 } 21 22 public static SessionFactory getSessionFactory() { 23 return sessionFactory; 24 } 25 26 public static void shutdown() { 27 // Close caches and connection pools 28 sessionFactory.close(); 29 } 30 31 }
#4准备hbm.xml文件
*.hbm.xml文件是POJO文件和数据库表之间建立关联的中间文件;通过Hibernate的中间类型,自动映射Java类型和SQL类型。常见的类型映射如下:
Java类型 |
Hibernate映射类型 |
SQL类型 |
String(0-255) |
String |
VARCHAR |
Int |
Int |
INT |
Char |
Character |
CHAR |
Boolean |
Boolean |
BIT |
String(>255) |
Text |
TEXT |
Byte[] |
Binary |
BLOB |
Java.sql.Date |
Date |
DATE |
如果*.hbm.xml中某个属性没有指定type,则Hibernate使用Java反射机制识别属性的类型,并为其自动配置一个Hibernate映射类型。
文件内容如下:
1 <?xml version="1.0"?> 2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 3 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 4 <!-- Generated 2013-10-22 15:28:34 by Hibernate Tools 3.4.0.CR1 --> 5 <hibernate-mapping> 6 <class name="org.hibernate.tutorial.domain.User" table="USER"> 7 <id name="userId" type="int"> 8 <column name="ID" /> 9 <generator class="increment" /> 10 </id> 11 <property name="userName" type="string"> 12 <column name="USER_NAME" length="20" not-null="true" /> 13 </property> 14 <property name="createdBy" type="string"> 15 <column name="CREATED_BY" length="20" not-null="true" /> 16 </property> 17 <property name="createdDate" type="date"> 18 <column name="CREATED_DATE" length="7" not-null="true" /> 19 </property> 20 </class> 21 </hibernate-mapping>
#5准备hibernate.cfg.xml文件
在Configuration.configure()的时候加载并解析hibernate.cfg.xml文件,需要指定Hibernate的启动参数,如驱动、用户名/密码、数据库连接池配置、数据库方言等等。
文件内容如下:
1 <?xml version=‘1.0‘ encoding=‘utf-8‘?> 2 <!DOCTYPE hibernate-configuration PUBLIC 3 "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 4 "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> 5 6 <hibernate-configuration> 7 <session-factory> 8 <!-- 指定连接数据库所用的驱动 --> 9 <property name="connection.driver_class">com.mysql.jdbc.Driver</property> 10 <!-- 指定连接数据库的url,hibernate连接的数据库名 --> 11 <property name="connection.url">jdbc:mysql://localhost/sampledb</property> 12 <!-- 指定连接数据库的用户名 --> 13 <property name="connection.username">root</property> 14 <!-- 指定连接数据库的密码 --> 15 <property name="connection.password"></property> 16 17 <!-- 指定连接池里最大连接数 --> 18 <property name="hibernate.c3p0.max_size">20</property> 19 <!-- 指定连接池里最小连接数 --> 20 <property name="hibernate.c3p0.min_size">1</property> 21 <!-- 指定连接池里连接的超时时长 --> 22 <property name="hibernate.c3p0.timeout">5000</property> 23 <!-- 指定连接池里最大缓存多少个Statement对象 --> 24 <property name="hibernate.c3p0.max_statements">100</property> 25 <property name="hibernate.c3p0.idle_test_period">3000</property> 26 <property name="hibernate.c3p0.acquire_increment">2</property> 27 <property name="hibernate.c3p0.validate">true</property> 28 29 <!-- 指定数据库方言 --> 30 <property name="dialect">org.hibernate.dialect.MySQLInnoDBDialect</property> 31 <!-- 根据需要自动创建数据库 --> 32 <property name="hbm2ddl.auto">update</property> 33 <!-- 显示Hibernate持久化操作所生成的SQL --> 34 <property name="show_sql">true</property> 35 <!-- 将SQL脚本进行格式化后再输出 --> 36 <property name="hibernate.format_sql">false</property> 37 38 <!-- 指定ORM文件 --> 39 <mapping resource="domain/user.hbm.xml"/> 40 </session-factory> 41 </hibernate-configuration>
#6 编译项目文件
进入到pom.xml文件所在的目录,并执行$mvn compile命令,maven会自动下载所需的jar包并编译所有java文件;
#7 Hibernate核心接口
Configuration:
获取ORM的元数据,根据hibernate.cfg.xml启动Hibernate,并返回SessionFactory实例;
SessionFactory:
一个SessionFactory对应一个数据源,因此如果有多个数据源则需要准备多个hibernate.cfg.xml文件;hibernate.cfg.xml引入*.hbm.xml映射文件。
org.hibernate.SessionFactory和org.hibernate.Session,前者是线程安全的全局变量,后者是由前者创建的只能在单线程环境下工作的局部变量;
SessionFactory是一个重量级的变量,其本身维护一个cache用于缓存预编译的SQL以及ORM元数据;同时还可以为其配置一个二级cache用于在事务之间共享读取过的数据。
Session:
非线程安全,因此避免在多个线程之间共享实例;Session本身缺省有一个一级cache,用于在同一个事务内部共享读取过的数据;
提供了所有与持久化相关的操作,保存、更新、删除、加载和查找;一个Session实例通常和一个数据库事务绑定,所有该事务内的操作都可以回滚;
Transaction:
对底层事务接口(JDBC、JTA、CORBA)做了统一封装,便于移植。
Query & Criteria:
此接口提供直接访问和操作DB的功能,Query使用HQL进行DB操作,Criteria适于动态查询。Query由session.createQuery(“[HQL]”)创建
Hibernate ORM(1):创建一个Maven & Hibernate & MySQL应用
标签:
原文地址:http://www.cnblogs.com/leo-chen-2014/p/4700180.html