在gradle中引入hibernate
相关gradle内容如下:
apply plugin: "java"
repositories {
jcenter()
}
dependencies {
compile "org.hibernate:hibernate-core:5.0.0.Final"
}
截止到本文时最新的hibernate是5.0.0版。
创建并编写配置文件”hibernate.cfg.xml”
hibernate的主配置文件有两种方式:”hibernate.properties”和”hibernate.cfg.xml”, 本文中我们采用第二种方式。如果对第一种方式感兴趣,可以自行搜索。
这里我们按照gradle java插件的默认源码结构规则,将”hibernate.cfg.xml”文件放到”src/main/resources”目录下。
配置文件的内容如下:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.dialect">
org.hibernate.dialect.PostgreSQLDialect
</property>
<property name="hibernate.connection.driver_class">
org.postgresql.Driver
</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<property name="hibernate.connection.url">
jdbc:postgresql://localhost:5432/zhanglong_test
</property>
<property name="hibernate.connection.username">
postgres
</property>
<property name="hibernate.connection.password">
123456
</property>
<!-- List of XML mapping files -->
<mapping resource="UserAccount.hbm.xml"/>
</session-factory>
</hibernate-configuration>
“”标签前面的部分基本上是固定的,不用更改,直接拷贝即可。
“hibernate.dialect”属性代表具体的数据库偏好,因为不同的数据库在具体的实现上,sql语句上会有一些差别,通过这个属性来制定具体的数据库”方言”可以让hibernate产生效率更高的SQL语句。
常用的一些支持的数据库”方言”如下:
Database | Dialect Property |
---|---|
DB2 | org.hibernate.dialect.DB2Dialect |
HSQLDB | org.hibernate.dialect.HSQLDialect |
HypersonicSQL | org.hibernate.dialect.HSQLDialect |
Informix | org.hibernate.dialect.InformixDialect |
Ingres | org.hibernate.dialect.IngresDialect |
Interbase | org.hibernate.dialect.InterbaseDialect |
Microsoft SQL Server 2000 | org.hibernate.dialect.SQLServerDialect |
Microsoft SQL Server 2005 | org.hibernate.dialect.SQLServer2005Dialect |
Microsoft SQL Server 2008 | org.hibernate.dialect.SQLServer2008Dialect |
MySQL | org.hibernate.dialect.MySQLDialect |
Oracle (any version) | org.hibernate.dialect.OracleDialect |
Oracle 11g | org.hibernate.dialect.Oracle10gDialect |
Oracle 10g | org.hibernate.dialect.Oracle10gDialect |
Oracle 9i | org.hibernate.dialect.Oracle9iDialect |
PostgreSQL | org.hibernate.dialect.PostgreSQLDialect |
Progress | org.hibernate.dialect.ProgressDialect |
SAP DB | org.hibernate.dialect.SAPDBDialect |
Sybase | org.hibernate.dialect.SybaseDialect |
Sybase Anywhere | org.hibernate.dialect.SybaseAnywhereDialect |
“hibernate.connection.driver_class”属性指定数据库驱动类名,hibernate可以通过配置的驱动类型用java的反射机制加载驱动类。
本人只使用过mysql和postgresql,所以只列出这两个数据库的驱动,启动可自行搜索,网上资料很多:
Database | driver class name |
---|---|
MySQL | com.mysql.jdbc.Driver |
PostgresSQL | org.postgresql.Driver |
“hibernate.hbm2ddl.auto”属性是告诉hibernate操作数据表的模式,可用的模式有:”validate”, “update”, “create”, “create-drop” 和”none”。
create:
每次加载hibernate时都会删除上一次的生成的表,然后根据你的model类再重新来生成新表,哪怕两次没有任何改变也要这样执行,这就是导致数据库表数据丢失的一个重要原因。
create-drop :
每次加载hibernate时根据model类生成表,但是sessionFactory一关闭,表就自动删除。
update:
最常用的属性,第一次加载hibernate时根据model类会自动建立起表的结构(前提是先建立好数据库),以后加载hibernate时根据 model类自动更新表结构,即使表结构改变了但表中的行仍然存在不会删除以前的行。要注意的是当部署到服务器后,表结构是不会被马上建立起来的,是要等 应用第一次运行起来后才会。
validate :
每次加载hibernate时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。
none:自己来维护表的创建,更改与销毁。
“hibernate.connection.url”属性指定数据库的连接字符串,这里列出MySql和PostgresSQL的, 注意连接字符串中的域名,端口和数据库名要替换成实际的:
DataBase | connection url |
---|---|
MySQL | jdbc:mysql://localhost:3600/zhanglong_test |
PostgreSQL | jdbc:postgresql://localhost:5432/zhanglong_test |
“hibernate.connection.username”属性指定数据库的用户名,用于连接数据库时的认证。
“hibernate.connection.password”属性指定数据库的用户密码,用于连接数据库时的认证。
“mapping”标签指定所有映射文件(定义domain类到关系数据库的映射方式)的位置,每个domain类对应一个。
编写domain类与映射文件
本文的代码按照gradle java插件的默认目录结构将java文件放到”src/main/java”目录下。
在”src/main/java”目录下创建”com.zhanglong.test.domains”包,并在新创建的包下创建”UserAccount.java”文件。文件的内容如下:
package com.zhanglong.test.domains;
public class UserAccount {
private Long id;
private String name;
private Integer age;
public UserAccount() {
}
public UserAccount(String name, int age) {
this.name = name;
this.age = age;
}
public void setId(Long id) {
this.id = id;
}
public Long getId() {
return this.id;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
public void setAge(int age) {
this.age = age;
}
public Integer getAge() {
return this.age;
}
}
然后在”src/main/resources”目录下为该类创建hibernate映射文件”UserAccount.hbm.xml”,内容如下:
<!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.zhanglong.test.domains">
<class name="UserAccount" table="user_account">
<id name="id" column="id">
<generator class="increment"/>
</id>
<property name="name" type="string" column="name"/>
<property name="age" type="int" column="int"/>
</class>
</hibernate-mapping>
编写业务代码并操作数据库
为了保证能顺利操作数据,我们还需要引入驱动包,在build.gradle文件中的”dependencies”模块中添加如下一行:
compile "org.postgresql:postgresql:9.4-1201-jdbc41"
此时整个build.gradle内容如下:
apply plugin: "java"
repositories {
jcenter()
}
dependencies {
compile "org.hibernate:hibernate-core:5.0.0.Final"
compile "org.postgresql:postgresql:9.4-1201-jdbc41"
}
在”com.zhanglong.test”包下创建”TestNativeApiHbmMapping.java”文件,文件内容如下:
package com.zhanglong.test;
import com.zhanglong.test.domains.UserAccount;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class TestNativeApiHbmMapping {
private static SessionFactory factory;
public static void main(String[] args) {
try{
factory = new Configuration().configure().buildSessionFactory();
} catch (Throwable ex) {
System.err.println("Failed to create sessionFactory object." + ex);
throw new ExceptionInInitializerError(ex);
}
System.out.println("factory: " + factory);
Session session = factory.openSession();
session.beginTransaction();
UserAccount me = new UserAccount("zhanglong", 26);
long meId = (Long) session.save(me);
System.out.println("meId: " + meId);
session.getTransaction().commit();
session.close();
}
}
build和运行
为了更方便的管理运行的包得依赖,我们使用gradle的fatJar插件将所有被依赖的包大包到一块。“build.gradle”问价中添加如下几行:
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'eu.appsatori:gradle-fatjar-plugin:0.3'
}
}
apply plugin: 'eu.appsatori.fatjar'
此时完整的build.gradle文件内容如下:
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'eu.appsatori:gradle-fatjar-plugin:0.3'
}
}
apply plugin: 'eu.appsatori.fatjar'
apply plugin: "java"
repositories {
jcenter()
}
dependencies {
compile "org.hibernate:hibernate-core:5.0.0.Final"
compile "org.postgresql:postgresql:9.4-1201-jdbc41"
}
在终端执行如下命令进行打包:
~$ gradle fatJar
命令执行成功后,将会生成一个build目录,最终的jar包就在“build/libs”目录下。
在终端执行如下命令运行jar包:
~$ java -cp build/libs/TestNativeApiHbmMapping.jar com.zhanglong.test.TestNativeApiHbmMapping
输出的结果如下:
九月 09, 2015 9:50:56 上午 org.hibernate.Version logVersion
INFO: HHH000412: Hibernate Core {5.0.0.Final}
九月 09, 2015 9:50:56 上午 org.hibernate.cfg.Environment <clinit>
INFO: HHH000206: hibernate.properties not found
九月 09, 2015 9:50:56 上午 org.hibernate.cfg.Environment buildBytecodeProvider
INFO: HHH000021: Bytecode provider name : javassist
九月 09, 2015 9:50:56 上午 org.hibernate.annotations.common.reflection.java.JavaReflectionManager <clinit>
INFO: HCANN000001: Hibernate Commons Annotations {5.0.0.Final}
九月 09, 2015 9:50:57 上午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
WARN: HHH000402: Using Hibernate built-in connection pool (not for production use!)
九月 09, 2015 9:50:57 上午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH000401: using driver [org.postgresql.Driver] at URL [jdbc:postgresql://localhost:5432/zhanglong_test]
九月 09, 2015 9:50:57 上午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH000046: Connection properties: {user=postgres, password=****}
九月 09, 2015 9:50:57 上午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH000006: Autocommit mode: false
九月 09, 2015 9:50:57 上午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
INFO: HHH000115: Hibernate connection pool size: 20 (min=1)
九月 09, 2015 9:50:57 上午 org.hibernate.dialect.Dialect <init>
INFO: HHH000400: Using dialect: org.hibernate.dialect.PostgreSQLDialect
九月 09, 2015 9:50:57 上午 org.hibernate.engine.jdbc.env.internal.LobCreatorBuilderImpl useContextualLobCreation
INFO: HHH000424: Disabling contextual LOB creation as createClob() method threw error : java.lang.reflect.InvocationTargetException
九月 09, 2015 9:50:57 上午 org.hibernate.type.BasicTypeRegistry register
INFO: HHH000270: Type registration [java.util.UUID] overrides previous : org.hibernate.type.UUIDBinaryType@55cf0d14
九月 09, 2015 9:50:57 上午 org.hibernate.tool.hbm2ddl.SchemaUpdate execute
INFO: HHH000228: Running hbm2ddl schema update
九月 09, 2015 9:50:57 上午 org.hibernate.tool.schema.extract.internal.InformationExtractorJdbcDatabaseMetaDataImpl processGetTableResults
INFO: HHH000262: Table not found: user_account
九月 09, 2015 9:50:57 上午 org.hibernate.tool.schema.extract.internal.InformationExtractorJdbcDatabaseMetaDataImpl processGetTableResults
INFO: HHH000262: Table not found: user_account
factory: org.hibernate.internal.SessionFactoryImpl@5b58ed3c
meId: 3
结果中最后两行是我们打印的运行成功的结果,前面是hibernate的log。