下面以一个简单的例子描述hibernate的使用。
软件配置:jdk1.6+hibernate4.1+oracle10g
1.hibernate包下载
先到hibernate官网下载hibernate的开发包hibernate-search-4.1.1.Final-dist.zip,解压缩此包,dist\lib目录下是开发所需的jar包。
2.在eclipse中创建java项目
项目创建后,需要引入依赖的jar包:
hibernate包:required下全部jar包,provided下的hibernate-jpa-2.0-api-1.0.1.Final.jar和jta-1.1.jar包
oracle包:ojdbc6.jar
日志包(可选,如果不添加则看不到hibernate的日志输出):slf4j-api-1.6.3.jar、logback-core-1.0.0.jar、logback-classic-1.0.0.jar
创建包:test,test.hibernate,test.model
3.创建数据库表
本示例使用oracle,其他数据库的特性和sql可参考一下代码稍作改变即可:
创建House表:
CREATE TABLE House
(
id NUMBER(8) NOT NULL,
name VARCHAR2(50),
address VARCHAR2(50) NOT NULL
)
;
ALTER TABLE House ADD CONSTRAINT PK_House
PRIMARY KEY (id)
USING INDEX
;
CREATE SEQUENCE SEQ_House_id
INCREMENT BY 1
START WITH 1
NOMAXVALUE
MINVALUE 1
NOCYCLE
NOCACHE
NOORDER
;
创建Person表:
CREATE TABLE Person
(
id NUMBER(8) NOT NULL,
name VARCHAR2(50),
age NUMBER(3)
)
;
ALTER TABLE Person ADD CONSTRAINT PK_Person
PRIMARY KEY (id)
USING INDEX
;
4.编写hibernate配置文件
在src目录下创建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="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>
<property name="connection.username">hi</property>
<property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
<property name="dialect">org.hibernate.dialect.Oracle10gDialect</property>
<property name="connection.password">hi</property>
<property name="transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property>
<property name="current_session_context_class">thread</property>
<!-- this will show us all sql statements -->
<property name="hibernate.show_sql">true</property>
<!-- mapping files -->
<mapping resource="test/model/House.hbm.xml"/>
<mapping class="test.model.Person"/>
</session-factory>
</hibernate-configuration>
注意看上面的mapping节点:第一个使用的是mapping映射文件,第二个使用java注解映射方式。这两个文件将在后面创建。
5.编写SessionFactoryUtil类
在test.hibernate包下建立SessionFactoryUtil类,此类用于获取session:
package test.hibernate;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
public class SessionFactoryUtil {
private static org.hibernate.SessionFactory sessionFactory;
private SessionFactoryUtil() {
}
static {
// 使用xml文件或者注解方式加载hibernate配置
sessionFactory = new AnnotationConfiguration().configure()
.buildSessionFactory();
// 只是用xml文件方式加载hibernate配置
// sessionFactory = new Configuration().configure().buildSessionFactory();
}
public static SessionFactory getInstance() {
return sessionFactory;
}
/**
* 打开会话但不绑定到会话上下文中
* @return the session
*/
public Session openSession() {
return sessionFactory.openSession();
}
/**
* 从会话上下文中返回会话,如果上下文中不存在会话示例则先创建一个会话示例并保存到上下文中,然后再返回。
* <br>
* 会话上下文与hibernate配置中的current_session_context_class属性值有关。
* @return the session
*/
public Session getCurrentSession() {
return sessionFactory.getCurrentSession();
}
/**
* 关闭会话工厂
*/
public static void close() {
if (sessionFactory != null)
sessionFactory.close();
sessionFactory = null;
}
}
6.创建映射文件和类
本例示范两种方式的映射,mapping文件和java注解方式。
House采用mapping文件映射方式,Person采用java注解映射方式。
在test.model包下新建House类(POJO):
package test.model;
public class House {
private Integer id;
private String name;
private String address;
/**
* @return the id
*/
public Integer getId() {
return id;
}
/**
* @param id the id to set
*/
public void setId(Integer id) {
this.id = id;
}
/**
* @return the name
*/
public String getName() {
return name;
}
/**
* @param name the name to set
*/
public void setName(String name) {
this.name = name;
}
/**
* @return the address
*/
public String getAddress() {
return address;
}
/**
* @param address the address to set
*/
public void setAddress(String address) {
this.address = address;
}
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
return "House [id=" + id + ", name=" + name + ", address=" + address
+ "]";
}
}
同时在此包下新建House.hbm.xml映射文件,通过此文件描述House类和数据库中的House表之间的映射关系:
<?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="test.model.House" table="house">
<id name="id" column="id">
<generator class="sequence">
<param name="sequence">SEQ_HOUSE_ID</param>
</generator>
</id>
<property name="name" column="name" />
<property name="address" column="address" />
</class>
</hibernate-mapping>
house表在数据库中使用名为SEQ_HOUSE_ID的序列作为主键id的值。如果表的主键生成方式不同,generator节点需要修改,网上有很多相关资料。
在test.model包下新建Person类(POJO),并添加注解来表述语数据库中Person表的映射关系,不做特殊说明时,默认数据库中的名车和类中名称一致。
package test.model;
import javax.persistence.AttributeOverride;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name="PERSON")//表名称和类名称相同时可以不添加此注解来说明
public class Person {
@Id
private Integer id;
private String name;
@AttributeOverride(column = @Column, name = "AGE")//字段名称和属性名称相同可以不添加此注解来说明
private int age;
/**
* @return the id
*/
public Integer getId() {
return id;
}
/**
* @param id the id to set
*/
public void setId(Integer id) {
this.id = id;
}
/**
* @return the name
*/
public String getName() {
return name;
}
/**
* @param name the name to set
*/
public void setName(String name) {
this.name = name;
}
/**
* @return the age
*/
public int getAge() {
return age;
}
/**
* @param age the age to set
*/
public void setAge(int age) {
this.age = age;
}
}
7.编写测试方法
package test;
import org.hibernate.Session;
import org.hibernate.Transaction;
import test.hibernate.SessionFactoryUtil;
import test.model.House;
import test.model.Person;
public class Test {
// private static Logger logger = LoggerFactory.getLogger(Test.class);//slf4j logging
public static void main(String[] args) {
Session session = SessionFactoryUtil.getInstance().getCurrentSession();
Transaction tx = session.beginTransaction();
House house = new House();//瞬态
house.setName("forest honey");
house.setAddress("beijing");
session.save(house);//持久态
//对持久态对象进行修改
house.setAddress("yj1212");
Person person = new Person();//瞬态
person.setId(1);
person.setAge(24);
person.setName("张三");
session.save(person);//持久态
session.delete(person);//session关闭后此person便会成为托管态对象
tx.commit();//提交事务,提交后会自动关闭session
// session.close();
}
}
执行上面的main方法,控制台输出:
Hibernate: select SEQ_HOUSE_ID.nextval from dual
Hibernate: insert into house (name, address, id) values (?, ?, ?)
Hibernate: insert into PERSON (age, name, id) values (?, ?, ?)
Hibernate: update house set name=?, address=? where id=?
Hibernate: delete from PERSON where id=?
测试类中紊乱的“业务逻辑”代码只是为了说明hibernate的使用方式,请忽略!呵呵。
hibernate拥有缓存机制,其中session便是一级缓存,还可以配置二级缓存。要想充分利用hibernate的优势,还需要深入了解hibernate的session,事务,缓存,延迟加载,以及各种对象尤其是session的生命周期等。后续再慢慢总结。
分享到:
相关推荐
这是我用空闲时间写的hibernatedemo的例子,试用于刚接触的java中hibernate框架的群体
对于初学者来说,通过这个demo可以了解到Hibernate的核心概念和基本操作,为进一步深入学习和应用Hibernate打下基础。在实际项目中,还需要考虑缓存、事务管理、性能优化等更多高级特性和最佳实践。
【标题】"HibernateDemo"是一个基于Java的开源对象关系...这个实例为深入学习Hibernate提供了基础,有助于理解ORM的工作原理和实际应用。同时,它也鼓励开发者去探索更高级的主题,如缓存管理、事务处理、查询优化等。
这个DEMO可以作为进一步学习和开发复杂应用的基础,你可以在此基础上添加更多的功能,例如事务管理、缓存支持、安全控制等。 值得注意的是,现代的Spring Boot已经极大地简化了这个过程,通过自动配置和起步依赖,...
总的来说,"springMvc+spring4+hibernate4搭建demo"是一个完整的Java Web开发基础框架,它集成了三个强大的开源库,提供了一种高效、灵活的方式来构建现代Web应用程序。开发者可以在此基础上添加自定义的功能,以...
【hibernate基础demo】是面向初学者的一个教程,旨在教授如何使用Hibernate这一流行的Java对象关系映射(ORM)框架。Hibernate通过注解的方式简化了数据库操作,将复杂的SQL语句与Java代码分离,使开发者可以更加...
**hibernate搭建基础demo** Hibernate 是一个强大的Java对象关系映射(ORM)框架,它允许开发者用面向对象的方式处理数据库交互,极大地简化了数据库编程。在这个基础demo中,我们将探讨如何搭建Hibernate环境,...
这个“springMVC+hibernate搭建的一个demo”旨在为初学者提供一个快速入门的实例,帮助他们理解和配置这些技术的集成环境。 SpringMVC是Spring框架的一部分,它提供了处理HTTP请求、管理控制器、数据绑定、视图解析...
这是一个在Myeclipse中的Hibernate入门小Demo
**标题:“Hibernate demo”** 这个项目是一个基于Hibernate的演示应用,旨在展示如何在Java Web环境中集成和使用Hibernate框架。Hibernate是Java领域中最流行的Object-Relational Mapping (ORM) 工具,它允许...
通过学习和实践这个"Spring3整合Hibernate4测试Demo",初学者可以深入了解Spring和Hibernate的整合,掌握如何在实际项目中运用这两个框架,为后续的Java Web开发打下坚实基础。在探索过程中,应注重理解每一个配置的...
**Hibernate+Maven入门demo详解** 在Java开发中,Hibernate是一个强大的对象关系映射(ORM)框架,它简化了数据库操作,使得开发者可以更专注于业务逻辑而不是底层的SQL语句。Maven则是一个项目管理工具,它管理...
在"标签"中,"spring 整合 hibernate helloworld"进一步强调了这是关于Spring与Hibernate整合的基础教学,可能包含了一个简单的入门级示例。"helloworld"通常表示最基础的程序,用于展示框架的基本用法。 在"压缩...
spring+springmvc+hibernate整合框架Demo,在此基础上开发或学习。其中包含apache的log4j记录日志信息,spring管理组件,springmvc分层,springaop配置数据库事务控制,hibernate二级缓存配置,实现了查询,用户登录...
这个"spring+hibernate框架demo"提供了一个整合这两个框架的小项目,便于初学者理解和学习。 Spring 框架: 1. **依赖注入**:Spring 的核心特性之一,它允许通过配置文件或注解来管理对象及其依赖关系,降低了组件...
总的来说,这个项目是一个很好的学习起点,涵盖了基础的Web开发和数据持久化知识,对于理解和掌握Struts与Hibernate的协同工作方式大有裨益。通过实践,你可以更好地理解MVC架构,学会如何使用Struts处理用户请求,...
通过实际运行和调试,开发者可以更深入地掌握Struts、Spring和Hibernate的使用技巧,为实际项目开发打下坚实基础。 在学习这个Demo时,建议首先了解每个框架的基本概念和用法,然后逐步分析项目的配置文件和源代码...
在本示例中,我们探讨的是一个基于...总之,这个“spring3.2 hibernate4 demo CRUD”实例提供了一个完整的、实战性的学习平台,帮助开发者快速上手Spring和Hibernate的整合,理解如何在Java Web开发中有效地管理数据。
【hibernateDemo】是一个关于Hibernate框架学习的项目,它主要涵盖了初学者在接触和理解Hibernate时会遇到的各种基础知识和实战技巧。Hibernate是一款强大的Java对象关系映射(ORM)框架,它极大地简化了数据库操作...