`
liunancun
  • 浏览: 33263 次
社区版块
存档分类
最新评论

Hibernate 4.3.7使用例子

    博客分类:
  • Java
阅读更多
今天心血来潮下了Hibernate 4.3.7,咋一用发现跟Hibernate 3不太一样,特此记录。

首先在Hibernate的官网下载
hibernate-release-4.3.7.Final.zip

解压Hibernate发现目录结构跟以前没多大区别
documentation目录下面放的是文档
lib目录下面放的是jar包
project目录下面放的的源码

在Eclipse中新建Java工程HelloHibernate
将hibernate-release-4.3.7.Final/lib/required中的所有包都放到工程的lib目录下
数据库使用的是H2,所以还要将H2的jar包h2-1.4.184.jar放到lib目录下

新建User实体类
package com.lnc.hello.hibernate;

public class User {

	private int id;

	private String username;

	private String password;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

}

新建实体类映射文件User.hbm.xml
<?xml version="1.0"?>
<!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.lnc.hello.hibernate">

	<class name="User" table="T_USER">
		<id name="id" column="ID">
			<generator class="increment" />
		</id>
		<property name="username" column="USERNAME" />
		<property name="password" column="PASSWORD" />
	</class>

</hibernate-mapping>

新建Hibernate配置文件hibernate.cfg.xml
<?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="connection.driver_class">org.h2.Driver</property>
		<property name="connection.url">jdbc:h2:mem:hello;DB_CLOSE_DELAY=-1;MVCC=TRUE</property>
		<property name="connection.username">sa</property>
		<property name="connection.password" />
		<property name="connection.pool_size">1</property>
		<property name="dialect">org.hibernate.dialect.H2Dialect</property>
		<property name="cache.provider_class">org.hibernate.cache.internal.NoCacheProvider</property>
		<property name="show_sql">true</property>
		<property name="hbm2ddl.auto">create</property>

		<mapping resource="com/lnc/hello/hibernate/User.hbm.xml" />
	</session-factory>

</hibernate-configuration>


新建Main测试类
package com.lnc.hello.hibernate;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;

public class Main {

	private static SessionFactory sf = null;

	public static SessionFactory createSessionFactory() {

		if (sf == null) {
			Configuration cfg = new Configuration().configure();
			ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
					.applySettings(cfg.getProperties()).build();
			sf = cfg.buildSessionFactory(serviceRegistry);
		}

		return sf;
	}

	public static void closeSessionFactory() {
		if (sf != null) {
			sf.close();
			sf = null;
		}
	}

	public static void setUser() {
		SessionFactory sf = createSessionFactory();
		Session session = sf.openSession();
		session.beginTransaction();
		User user = new User();
		user.setUsername("username");
		user.setPassword("password");
		session.save(user);
		session.getTransaction().commit();
		session.close();
	}

	public static User getUser() {
		SessionFactory sf = createSessionFactory();
		Session session = sf.openSession();
		session.beginTransaction();
		User user = (User) session.get(User.class, 1);
		session.getTransaction().commit();
		session.close();

		return user;
	}

	public static void main(String[] args) {

		setUser();

		User user = getUser();
		System.out.println(user.getUsername());

	}

}


运行Main输出
Hibernate: drop table T_USER if exists
Hibernate: create table T_USER (ID integer not null, USERNAME varchar(255), PASSWORD varchar(255), primary key (ID))
Hibernate: select max(ID) from T_USER
Hibernate: insert into T_USER (USERNAME, PASSWORD, ID) values (?, ?, ?)
Hibernate: select user0_.ID as ID1_0_0_, user0_.USERNAME as USERNAME2_0_0_, user0_.PASSWORD as PASSWORD3_0_0_ from T_USER user0_ where user0_.ID=?
username


跟Hibernate 3的区别在于获取SessionFactory的方式
以前Hibernate 3下面方式获取
Configuration cfg = new Configuration().configure();
SessionFactory sf = cfg.buildSessionFactory();


buildSessionFactory方法在Hibernate 4中已经不推荐使用了
Hibernate 4中推荐使用带参数的buildSessionFactory方法
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder()
		.applySettings(cfg.getProperties()).build();
SessionFactory sf = cfg.buildSessionFactory(serviceRegistry);


但发现ServiceRegistryBuilder也是不推荐使用的
最后上网查了一把发现需要使用StandardServiceRegistryBuilder类
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
		.applySettings(cfg.getProperties()).build();
SessionFactory sf = cfg.buildSessionFactory(serviceRegistry);


还有一个session的get方法跟load方法的区别
get方法是在执行方法的时候就会去查数据库
load方法是在使用的时候才会去查数据库
如果上面的例子把get方法换成load方法会报如下异常
Exception in thread "main" org.hibernate.LazyInitializationException: could not initialize proxy - no Session
	at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:165)
	at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:286)
	at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:185)
	at com.lnc.hello.hibernate.User_$$_jvst81d_0.getUsername(User_$$_jvst81d_0.java)
	at com.lnc.hello.hibernate.Main.main(Main.java:61)

这是因为在getUsername方法执行的时候才去查数据库,而这时候session已经被关闭。
分享到:
评论

相关推荐

    spring4.1.2、hibernate4.3.7、struts2.3.16.3搭建学习例子

    在本项目中,我们主要关注的是使用Spring 4.1.2、Hibernate 4.3.7和Struts2.3.16.3这三个框架搭建一个基础的学习环境。这三者是Java企业级开发中非常流行的开源工具,分别负责控制层、持久层和表现层的管理。下面将...

    multitenancyinhibernate:Hibernate 中的多租户(使用 Hibernate 4.3.7 和 PostgreSql 9.3.1)

    Hibernate 中的多租户(使用 Hibernate 4.3.7 和 PostgreSql 9.3.1) 这是 Hibernate 和 PostGreSql 中多租户的完整工作示例。 我们实现多租户的方法是 - 在同一数据库中为每个租户使用单独的架构。使用的版本 - ...

    Hibernate入门例子

    ### Hibernate入门知识点详解 #### 一、环境搭建与配置 **1.1 环境需求** - **开发工具:** Eclipse JEE Kepler 版本 ...通过这个入门例子,可以快速了解Hibernate的工作原理及其与Java应用程序集成的方式。

    spring-framework-4.3.7.RELEASE官方完整包加官方文档

    官方文档中,会详细阐述以上每个特性的使用方法、示例代码以及配置指南,帮助开发者更好地理解和利用 Spring 框架。"spring-framework-4.3.7.RELEASE-dist.zip" 包含了实际的框架库,而 "spring-framework-4.3.7....

    spring-memcache-sample:示例 Spring 项目,使用基于 memcached 的缓存后端缓存注释

    发布REST HATEOAS 支持Hibernate4.3.7.决赛ORM 杰克逊2.4.4 JSON 支持小时2 1.4.182 嵌入内存数据库简单弹簧内存缓存3.5.1-快照注释性 Memcached 缓存缓存2.9.0 在 JVM 缓存中码头跑者9.2.5.v20141112 Jetty 网络...

    Spring基础包

    在学习和使用Spring4.3.7时,开发者需要了解XML配置、注解配置以及Java配置类的不同方式,理解IoC容器如何管理bean,如何定义bean之间的依赖关系。同时,掌握Spring MVC的工作原理,包括DispatcherServlet、...

    spring 4jar 包

    4. **samples**目录:可能包含示例代码,帮助开发者快速上手和理解如何使用Spring。 总的来说,Spring 4.3.7.RELEASE是一个强大的工具,它提供了全面的框架支持,涵盖了从基础的依赖注入到复杂的Web和数据访问场景...

    J2EE应用开发详解

    57 4.3.7 Servlet协作 57 4.3.8 Filter 58 4.4 使用Servlet处理客户端请求 58 4.5 会话跟踪 61 4.5.1 使用Cookie进行会话跟踪 61 4.5.2 使用URL重写进行会话跟踪 62 4.5.3 使用隐藏表单域进行会话跟踪 63 4.6 小结 ...

    sshweb.rar SSH三大框架 新手学习

    在Spring 4.3.7版本中,它已经非常成熟,支持Java 8特性,并且有着广泛的应用。通过Spring,开发者可以轻松管理对象的生命周期和相互依赖关系,减少代码间的耦合,提升系统的可测试性和可维护性。 Struts2作为MVC...

    ARCH4系统开发指南

    2.8 如何使用Hibernate操作Informix数据库 20 2.8.1 实现对LOB数据对象的支持 20 2.8.1.1 配置dataAccessContext-hibernate.xml 20 2.8.1.2 操作CLOB数据 20 2.8.1.3 操作BLOB数据 21 2.8.2 实现Sequence主键生成...

Global site tag (gtag.js) - Google Analytics