文档章节

session的load加载方式demo

绿林小子
 绿林小子
发布于 2015/12/11 11:18
字数 785
阅读 48
收藏 1
    本文主要采用实例展示load加载对象的方式:
    1. BankAccount.java
package com.lxh.transaction5;

import java.io.Serializable;

@SuppressWarnings("serial")
public class BankAccount implements Serializable {

	private String id;
	private String name;
	private int balance;

	public BankAccount() {

	}

	public BankAccount(String id, String name, int balance) {
		this.id = id;
		this.name = name;
		this.balance = balance;
	}

	public String getId() {
		return id;
	}

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

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getBalance() {
		return balance;
	}

	public void setBalance(int balance) {
		this.balance = balance;
	}

	// 重写EQUAL方法
	public boolean equals(Object other) {
		if ((this == other))
			return true;
		if ((other == null))
			return false;
		if (!(other instanceof BankAccount))
			return false;
		BankAccount castOther = (BankAccount) other;
		return ((this.getId() == castOther.getId()) || (this.getId() != null
				&& castOther.getId() != null && this.getId().equals(
				castOther.getId())))
				&& ((this.getName() == castOther.getName()) || (this.getName() != null
						&& castOther.getName() != null && this.getName()
						.equals(castOther.getName())))
				&& ((this.getBalance() == castOther.getBalance()));
	}

	// 重写HASHCODE方法
	public int hashCode() {
		int result = 17;
		result = 37 * result + (getId() == null ? 0 : this.getId().hashCode());
		result = 37 * result + (getName() == null ? 0 : this.getName().hashCode());
		result = 37 * result + this.getBalance();
		return result;
	}
}
    2. BankAccount.hbm.xml
<?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="com.lxh.transaction5.BankAccount" table="BankAccount" lazy="true">
		<cache usage="read-write" />
		<id name="id" type="string">
			<column name="id" />
		</id>
		<!-- name字段设置唯一约束 -->
		<property name="name" type="string" unique-key="true">
			<column name="name" not-null="true" />
		</property>
		<property name="balance" type="java.lang.Integer">
			<column name="balance" />
		</property>
	</class>
</hibernate-mapping>
    3. BankAccountDao.java
package com.lxh.transaction5;

import java.io.Serializable;

public interface BankAccountDao {
	// 查询用户余额
	public int getUserBalanceById(Serializable id);
}
    4. BankAccountDaoImpl.java
package com.lxh.transaction5;

import java.io.Serializable;

import org.apache.log4j.Logger;
import org.hibernate.Session;
import org.hibernate.SessionFactory;

public class BankAccountDaoImpl implements BankAccountDao {
	// 日志
	private final static Logger logger = Logger
			.getLogger(BankAccountDaoImpl.class);
	public static SessionFactory sf = SessionFactoryUtil
			.getConfigurationByXML().buildSessionFactory();

	// 查询用户余额
	public int getUserBalanceById(Serializable id) {
		int balance = 0;
		//
		Session session = sf.openSession();
		session.beginTransaction();
		try {
			// load加载
			BankAccount ba = (BankAccount) session.load(BankAccount.class, id);
			balance = ba.getBalance();
			session.getTransaction().commit();
		} catch (Exception e) {
			logger.error("" + e.getMessage());
			session.getTransaction().rollback();
		} finally {
			if (session != null) {
				if (session.isOpen()) {
					session.close();
				}
			}
		}
		return balance;
	}

}
    5. SessionFactoryUtil.java
package com.lxh.transaction5;

import java.io.File;
import org.hibernate.cfg.Configuration;

public class SessionFactoryUtil {
	// path
	private static String path = SessionFactoryUtil.class.getResource("")
			.getPath().toString();

	// hibernate.cfg.xml文件方式获取
	public static Configuration getConfigurationByXML() {
		// 加载配置文件
		Configuration config = new Configuration();
		Configuration cfg = config.configure(new File(path
				+ "hibernate.cfg.xml"));
		return cfg;
	}
}
    6. 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.username">test</property>
		<property name="connection.password">test</property>
		<property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
		<property name="connection.url">jdbc:oracle:thin:@127.0.0.1:1521:tran</property>
		<!-- SQL方言 -->
		<property name="dialect">org.hibernate.dialect.OracleDialect</property>
		<!-- 自动创建数据表 -->
		<property name="hbm2ddl.auto">update</property>
		<!-- 显示实际操作数据库时的SQL -->
		<property name="show_sql">true</property>
		<property name="format_sql">true</property>
		<property name="use_sql_comments">false</property>
		<!-- 编码方式 -->
		<property name="connection.characterEncoding">UTF-8</property>
		<!-- 事务相关 -->
		<property name="current_session_context_class">thread</property>
		<property name="connection.release_mode">auto</property>
		<property name="transaction.auto_close_session">false</property>
		<property name="connection.autocommit">false</property>
		<!-- C3P0数据源设置 -->
		<property name="c3p0.min_size">5</property>
		<property name="c3p0.max_size">20</property>
		<property name="c3p0.timeout">1800</property>
		<property name="c3p0.max_statements">50</property>
		<!-- 查询缓存 -->
		<!-- <property name="hibernate.cache.use_query_cache">true</property> -->
		<!-- 二级缓存 -->
		<property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
		<property name="hibernate.cache.use_second_level_cache">true</property>
		<!-- 对象与数据库表格映像文件 -->
		<mapping resource="com/lxh/transaction5/BankAccount.hbm.xml" />
	</session-factory>
</hibernate-configuration>
    7. Test.java
package com.lxh.transaction5;

public class Test {

	public static void main(String[] args) {
		BankAccountDao bad = new BankAccountDaoImpl();
		// 查询
		for (int i = 0; i < 5; i++) {   
			System.out.println(bad.getUserBalanceById("20151209163409"));
		}
	}

}
    8. 运行结果以及分析
       数据库表结果

       运行结果

       分析:
       只有在调用实体属性的时候才与数据库交互(此例中缓存没有需要查询的对象),第一次之后就可以从缓存中获取。

    9. 补充说明
        若出现"org.hibernate.LazyInitializationException: could not initialize proxy - no Session  ……"问题:
       解决方式:
       <1> 将load改成get的方式来得到该对象;
       <2> 在表示层来开启我们的session和关闭session,(本例中可以将finally语句块去掉,不建议).

© 著作权归作者所有

绿林小子
粉丝 5
博文 131
码字总数 45566
作品 0
福州
私信 提问
Hibernate中get和load的区别

作者博客@Stone原地址 在Hibernate中如果要从数据库中得到一个对象 两种方法 通过session.get()方法 通过session.load()方法 区别 load加载方式 当使用load方法来得到一个对象时,此时hiber...

1314Stone
2017/11/24
0
0
【深入浅出Node.js系列十一】Node.js开发框架Express4.x

深入浅出Node.js系列 【深入浅出Node.js系列一】什么是Node.js 【深入浅出Node.js系列二】Node.js&NPM的安装与配置 【深入浅出Node.js系列三】深入Node.js的模块机制 【深入浅出Node.js系列四...

陶邦仁
2016/01/19
374
0
Hibernate懒加载

面试题: get、load方法区别? get: 及时加载,只要调用get方法立刻向数据库查询 load:默认使用懒加载,当用到数据的时候才向数据库查询。 懒加载:(lazy) 概念:当用到数据的时候才向数据库...

爪哇程序猿
2015/10/22
172
0
Hibernate操作数据库

1,使用Hibernate加载数据 加载数据是指通过标识符得到指定类的持久化对象,Session提供了get()和load() 两种方法来加载数据 (不操作数据不用事务这个概念) 1>get() public void HIbernateTe...

u012843873
2018/01/23
0
0
Hibernate get和load区别

get和load方式是根据id取得一个记录 下边详细说一下get和load的不同,因为有些时候为了对比也会把find加进来。 1.从返回结果上对比: load方式检索不到的话会抛出org.hibernate.ObjectNotFo...

GreenDay
2014/02/20
286
3

没有更多内容

加载失败,请刷新页面

加载更多

新建作业20191011121223

2.编写一个程序,发出一声警报,然后打印下面的文本: Startled by the sudden sound,Sally shouted,"By the Great Pumpkin,what was that!" #include<stdio.h>int main(){printf("\a");......

电子197朱妍
16分钟前
1
0
家庭作业——苗钰婷

2 编写一个程序,发出一声警报,然后打印下面的文本: Startled by the sudden sound, Sally shouted, "By the Great Pumpkin, what was that! #include<stdio.h>int main(){......

OSC_Okruuv
36分钟前
5
0
经典系统设计面试题解析:如何设计TinyURL(一)

原文链接: https://www.educative.io/courses/grokking-the-system-design-interview/m2ygV4E81AR 编者注:本文以一道经典的系统设计面试题:《如何设计TinyURL》的参考答案和解析为例,帮助...

APEMESH
37分钟前
4
0
2.面向对象设计原则(7条)

开闭原则 开闭原则的含义是:当应用的需求改变时,在不修改软件实体的源代码或者二进制代码的前提下,可以扩展模块的功能,使其满足新的需求。 实现方法 可以通过“抽象约束、封装变化”来实...

Eappo_Geng
40分钟前
8
0
8086汇编基础 debug P命令 一步完成loop循环

    IDE : Masm for Windows 集成实验环境 2015     OS : Windows 10 x64 typesetting : Markdown    blog : my.oschina.net/zhichengjiu    gitee : gitee.com/zhichengjiu   ......

志成就
44分钟前
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部