您的位置:首页 > 其它

第一个 Hibernate 应用程序

2015-12-09 22:58 405 查看
1. 新建Java Project

2. 在项目下新建资源文件夹 res : 存放配置文件

3. 在项目下新建类库文件夹lib : 存放jar类库文件

4. Hibernate程序必要的类库:Build Path->Add To Build Path

a) 数据库连接库:

mysql-connector-java-5.1.38-bin.jar

b) Hibernate5库:(必选导入的包)

lib\required

hibernate-core-5.0.5.Final.jar

jboss-logging-3.3.0.Final.jar

dom4j-1.6.1.jar

hibernate-commons-annotations-5.0.1.Final.jar

hibernate-jpa-2.1-api-1.0.0.Final.jar

javassist-3.18.1-GA.jar

lib\osgi\

geronimo-jta_1.1_spec-1.1.1.jar

5. Hibernate配置文件参考: hibernate-release-5.0.5.Final\project\etc

a) hibernate.cfg.xml(复杂配置)

注意:头文件hibernate-configuration-3.0.dtd,根据自己的数据环境进行配置

b) hibernate.properties(简单配置/参考)

c) log4j.properties(可选,日志配置)

ehcache.xml(可选,二级缓存配置)

基于映射文件的hibernate例子:

1. 编写Domain(Entity/Pojo)类Event.java。

2. 编写Event.hbm.xml映射文件(映射头文件hibernate-mapping-3.0.dtd)

3. 把映射文件配置到hibernate.cfg.xml

4. 编写持久层EventDao.java

5. 编写EventDao的测试类TestEventDao

项目结构:



Event.java

package com.demo.entity;

import java.util.Date;

public class Event

{

//属性名 默认为 表列名

private Long id; //表的 主键

private String title; //表的 列 varchar

private Date date; //表的 列 datetime(默认) time date

public Long getId() {

return id;

}

public String getTitle() {

return title;

}

public Date getDate() {

return date;

}

public void setId(Long id) {

this.id = id;

}

public void setTitle(String title) {

this.title = title;

}

public void setDate(Date date) {

this.date = date;

}

}

Event.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.demo.entity">

<class name="Event" table="event">

<id name="id" column="EVENT_ID">

<generator class="native"/><!-- 主键的生成策略 -->

</id>

<property name="date" type="date" column="EVENT_DATE"/>

<property name="title" length="25"/>

</class>

</hibernate-mapping>

HibernateUtil.java

package com.demo.util;

import org.hibernate.SessionFactory;

import org.hibernate.boot.MetadataSources;

import org.hibernate.boot.registry.StandardServiceRegistry;

import org.hibernate.boot.registry.StandardServiceRegistryBuilder;

import org.hibernate.cfg.Configuration;

public class HibernateUtil

{

//static final常量:声明的时候必须要初始化,只初始化1次

private static final SessionFactory sessionFactory = buildSessionFactory();

private static SessionFactory buildSessionFactory() {

try {

// 加载 hibernate.cfg.xml

StandardServiceRegistry registry =

new StandardServiceRegistryBuilder().configure().build();

// 根据 hibernate.cfg.xml 配置 初始化 SessionFactory

return new MetadataSources(registry).buildMetadata().buildSessionFactory();

}

catch (Throwable ex) {

// Make sure you log the exception, as it might be swallowed

System.err.println("Initial SessionFactory creation failed." + ex);

throw new ExceptionInInitializerError(ex);

}

}

//公共访问单例方法

public static SessionFactory getSessionFactory() {

return sessionFactory;

}

}

TestEvent.java

package com.demo.test;

import java.util.Date;

import org.hibernate.Session;

import com.demo.entity.Event;

import com.demo.util.HibernateUtil;

public class TestEvent

{

public static void main(String[] args) {

TestEvent test = new TestEvent();

Event event = new Event();

event.setTitle("市场活动");

event.setDate(new Date());

test.saveEvent(event);

}

private void saveEvent(Event event){

//1.HibernateUtil获取SessionFactory来创建一个Session

Session session = HibernateUtil.getSessionFactory().getCurrentSession();

//2.通过Session开启事务

session.beginTransaction();

//3.核心API save update delete find get ...

session.save(event);

//4.通过Session提交事务

session.getTransaction().commit();

}

private void updateEvent(Event event){

//1.HibernateUtil获取SessionFactory来创建一个Session

Session session = HibernateUtil.getSessionFactory().getCurrentSession();

//2.通过Session开启事务

session.beginTransaction();

//3.核心API save update delete find get ...

session.update(event);

//4.通过Session提交事务

session.getTransaction().commit();

}

private void deleteEvent(Event event){

//1.HibernateUtil获取SessionFactory来创建一个Session

Session session = HibernateUtil.getSessionFactory().getCurrentSession();

//2.通过Session开启事务

session.beginTransaction();

//3.核心API save update delete find get ...

session.delete(event);

//4.通过Session提交事务

session.getTransaction().commit();

}

}

hibernate.cfg.xml

<!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="connection.driver_class">com.mysql.jdbc.Driver</property>

<!-- 连接数据库地址-->

<property name="connection.url">jdbc:mysql://localhost:3306/hibernatedemo</property>

<!-- 连接数据库所需账号-->

<property name="connection.username">root</property>

<!-- 连接数据库所需密码-->

<property name="connection.password">root</property>

<!-- 数据库连接池数量 -->

<property name="connection.pool_size">1</property>

<!-- 数据库方言(解决跨数据库平台问题) -->

<property name="dialect">org.hibernate.dialect.MySQLDialect</property>

<!-- thread安全模式 :自动创建/关闭 session -->

<property name="current_session_context_class">thread</property>

<!-- 是否提供缓冲 -->

<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>

<!-- 是否显示sql语句 -->

<property name="show_sql">true</property>

<!-- Drop and re-create the database schema on startup -->

<property name="hbm2ddl.auto">update</property>

<!-- 映射文件路径配置 -->

<mapping resource="com/demo/entity/Event.hbm.xml"/>

</session-factory>

</hibernate-configuration>

基于注解方式的hibernate例子:

红色为必选添加的注解

基于Annotations的映射:

注解名

声明位置

用途

@Entity

Class的上方

声明一个映射实体对象

@Table

Class的上方, @Entity的下方

可配值:

name

uniqueConstraints

schema

indexes

catalog

声明映射数据库的名字,唯一约束等。建议使用全小写表名解决Mysql不同平台表名大小写兼容问题。

@Id

主键的属性或get方法上方

声明一个主键属性

@GeneratedValue

可声明于@Id注解下方

可配值:

strategy=GenerationType.AUTO

strategy=GenerationType.SEQUENCE

strategy=GenerationType.IDENTITY

strategy=GenerationType.TABLE

主键值的生成策略

@Version

Integer字段属性或get方法上方

乐观锁

@Transient

易失变量,不会被持久化到数据库.例如系统运行中使用,但是不需要保存到数据库.

@Temporal

@Temporal(TemporalType.DATE)

@Temporal(TemporalType.TIME)

@Temporal(TemporalType.TIMESTAMP)//默认

Date数据类型的时间精度.

@Enumerated

// @Enumerated(EnumType.ORDINAL) //默认,存下标索引

// @Enumerated(EnumType.STRING) //枚举值

枚举类型的存储精度

@Lob

根据属性的类型配合使用

@Lob+String 大文本

@Lob+Byte[] 文件/图片字节

和上面例子不同的文件为:

Event.java

package com.demo.entity;

import java.util.Date;

import javax.persistence.Entity;

import javax.persistence.GeneratedValue;

import javax.persistence.GenerationType;

import javax.persistence.Id;

import javax.persistence.Table;

@Entity

@Table(name="t_event")

public class Event

{

//属性名 默认为 表列名

private Long id; //表的 主键

private String title; //表的 列 varchar

private Date date; //表的 列 datetime(默认) time date

@Id

@GeneratedValue(strategy=GenerationType.IDENTITY)

//@GeneratedValue//ID生成策略:// 4.0 AUTO 默认为 IDENTITY // 5.0 AUTO默认为SEQUENCE

public Long getId() {

return id;

}

public String getTitle() {

return title;

}

public Date getDate() {

return date;

}

public void setId(Long id) {

this.id = id;

}

public void setTitle(String title) {

this.title = title;

}

public void setDate(Date date) {

this.date = date;

}

}

然后在修改hibernate.cfg.xml中 <mapping resource="com/demo/entity/Event.hbm.xml"/>为<mapping class="com.demo.entity.Event"/>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: