今天心血来潮下了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已经被关闭。
分享到:
相关推荐
在本项目中,我们主要关注的是使用Spring 4.1.2、Hibernate 4.3.7和Struts2.3.16.3这三个框架搭建一个基础的学习环境。这三者是Java企业级开发中非常流行的开源工具,分别负责控制层、持久层和表现层的管理。下面将...
Hibernate 中的多租户(使用 Hibernate 4.3.7 和 PostgreSql 9.3.1) 这是 Hibernate 和 PostGreSql 中多租户的完整工作示例。 我们实现多租户的方法是 - 在同一数据库中为每个租户使用单独的架构。使用的版本 - ...
### Hibernate入门知识点详解 #### 一、环境搭建与配置 **1.1 环境需求** - **开发工具:** Eclipse JEE Kepler 版本 ...通过这个入门例子,可以快速了解Hibernate的工作原理及其与Java应用程序集成的方式。
官方文档中,会详细阐述以上每个特性的使用方法、示例代码以及配置指南,帮助开发者更好地理解和利用 Spring 框架。"spring-framework-4.3.7.RELEASE-dist.zip" 包含了实际的框架库,而 "spring-framework-4.3.7....
发布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 网络...
在学习和使用Spring4.3.7时,开发者需要了解XML配置、注解配置以及Java配置类的不同方式,理解IoC容器如何管理bean,如何定义bean之间的依赖关系。同时,掌握Spring MVC的工作原理,包括DispatcherServlet、...
4. **samples**目录:可能包含示例代码,帮助开发者快速上手和理解如何使用Spring。 总的来说,Spring 4.3.7.RELEASE是一个强大的工具,它提供了全面的框架支持,涵盖了从基础的依赖注入到复杂的Web和数据访问场景...
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 小结 ...
在Spring 4.3.7版本中,它已经非常成熟,支持Java 8特性,并且有着广泛的应用。通过Spring,开发者可以轻松管理对象的生命周期和相互依赖关系,减少代码间的耦合,提升系统的可测试性和可维护性。 Struts2作为MVC...
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主键生成...
- **4.3.2 导入SSH相关的依赖**: Spring、Hibernate和Struts等框架的依赖项需要添加到项目中。 - **4.3.3 导入jbpm相关的依赖**: 添加JBPM库和其他相关依赖项。 - **4.3.4 使用jotm配置tomcat数据源以支持JTA**: ...