`
hz_chenwenbiao
  • 浏览: 1007792 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

请您先登录,才能继续操作

hibernate操作大对象

阅读更多

    hibernate操作大对象示例,至于能存入多大的数据量,就由mysql的大数据字段来决定,还有就是运行时文件流转换过程有没有超出内存的大小来决定的。

 

1 Student.java

package entity;

import java.io.Serializable;
import java.sql.Blob;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Student implements Serializable{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	@Id
	@GeneratedValue(strategy=GenerationType.AUTO) 
	private Integer id;
	
	@Column(length=20)
	private String name;
	@Column(nullable=true)
	private Blob file = null;//这里不要起个blob的名字作为数据库的字段,因为它是数据库的关键字,这样hibernate会出错的。
	
	
	public Student(){
	}


	public Integer getId() {
		return id;
	}


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


	public String getName() {
		return name;
	}


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


	public Blob getFile() {
		return file;
	}


	public void setFile(Blob file) {
		this.file = file;
	}
	
}

 

2 StudentServer.java

package server;

import entity.Student;

public interface StudentServer {

	public void save(Student student);
	public Student getByid(Integer id);
	
}

 

3 StudentServerImpl.java

package server.impl;

import javax.annotation.Resource;

import org.hibernate.Hibernate;
import org.hibernate.SessionFactory;
import org.springframework.transaction.annotation.Transactional;

import server.StudentServer;

import entity.Student;


@Transactional
/*
 * 没加入@Transactional会产生如下异常:
 org.hibernate.HibernateException: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here
	at org.springframework.orm.hibernate3.SpringSessionContext.currentSession(SpringSessionContext.java:63)
	at org.hibernate.impl.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:574)
	at biao.scut.server.impl.StudentServerImpl.save(StudentServerImpl.java:21)
	at Junit.StudentServerTest.testSave(StudentServerTest.java:34)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
	at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
	at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:73)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:46)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:180)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:41)
	at org.junit.runners.ParentRunner$1.evaluate(ParentRunner.java:173)
	at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
	at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:220)
	at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:46)
	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
 
 */
public class StudentServerImpl implements StudentServer {

	@Resource SessionFactory sessionFactory;
	
	@Override
	public Student getByid(Integer id) {
		Student student = (Student) sessionFactory.getCurrentSession().get(Student.class, id);
		Hibernate.initialize(student.getFile());
		return student;
	}

	@Override
	public void save(Student student) {
		sessionFactory.getCurrentSession().persist(student);
	}

}

 

4 大对象数据操作主要的实现部分:

package Junit;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Blob;
import java.sql.SQLException;

import org.hibernate.Hibernate;
import org.junit.BeforeClass;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import server.StudentServer;

import entity.Student;


public class StudentServerTest {

/*	//这里的java项目,而不是web项目,所以不能用注解方式
	@Resource private StudentServer studentServer;*/
	private static StudentServer studentServer;
	
	
	
	@BeforeClass
	public static void setUpBeforeClass() throws Exception {
		
		//实例化spring容器,这里不用@Resource注解来做,是因为这里没放到服务器就可以运行,当把项目放入到服务器中,那就可以直接用注解的简便方式来引用spring配好的Bean
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");
		//用容器获取一个bean,这些bean要在配置文件里有的
		studentServer = (StudentServer)applicationContext.getBean("studentServer");
	}

	@Test
	public void testSave() {
		Student student = new Student();
		student.setName("dianying");
		File file = new File("d:\\e.rmvb");
		FileInputStream fis = null;
		Blob temp;
		
		try {
			fis = new FileInputStream(file);
			temp = Hibernate.createBlob(fis);
//			fis.close();
			student.setFile(temp);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		studentServer.save(student);
		try {
			fis.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	@Test
	public void testGetByid() {
		Student student = studentServer.getByid(22);
		Blob fileBlob = student.getFile();
		File out = new File("D:\\bb");//ce.rmvb
		FileOutputStream fos;
		BufferedOutputStream bos;
		
		
		
		InputStream is;
		BufferedInputStream bis;
		byte[] b = new byte[1024];
		
		try {
			fos = new FileOutputStream(out);
			bos = new BufferedOutputStream(fos);
			
			is = fileBlob.getBinaryStream();
			bis = new BufferedInputStream(is);
			
			
			while( bis.read(b) != -1 ){
				bos.write(b);
			}
			bos.close();
			fos.close();
			
			bos.close();
			is.close();
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}

}

 

5 spring配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
	 <context:annotation-config/>
	 <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
	    <property name="driverClassName" value="org.gjt.mm.mysql.Driver"/>
	    <property name="url" value="jdbc:mysql://localhost:3306/test?useUnicode=true&amp;characterEncoding=UTF-8"/>
	    <property name="username" value="root"/>
	    <property name="password" value=""/>
	     <!-- 连接池启动时的初始值 -->
		 <property name="initialSize" value="1"/>
		 <!-- 连接池的最大值 -->
		 <property name="maxActive" value="500"/>
		 <!-- 最大空闲值.当经过一个高峰时间后,连接池可以慢慢将已经用不到的连接慢慢释放一部分,一直减少到maxIdle为止 -->
		 <property name="maxIdle" value="2"/>
		 <!--  最小空闲值.当空闲的连接数少于阀值时,连接池就会预申请去一些连接,以免洪峰来时来不及申请 -->
		 <property name="minIdle" value="1"/>
	  </bean>

	  
 <!-- 下面是用hiberanate的二级缓存的配置,先生成sessionFactory,再将数据源(上面配好的),注入到这里的name=dataSource这里来-->
	<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
	     <property name="dataSource" ref="dataSource"/>
		<!-- 下面完成hiberate的配置映射文件,它可以有多条的映射文件列表 -->
		<property name="annotatedClasses">  
         <list>  
           <value>entity.Student</value>  
         </list>  
       </property>
		
		 <!-- 下面是对hibernate的属性的设置 -->
	     <property name="hibernateProperties">
		    <value>
		        hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
		        hibernate.hbm2ddl.auto=update
		        hibernate.show_sql=true
		        hibernate.format_sql=true
		        hibernate.cache.use_second_level_cache=true<!-- 使用二级缓存 -->
       	        hibernate.cache.use_query_cache=false
        	    hibernate.cache.provider_class=org.hibernate.cache.EhCacheProvider
		      </value>
	     </property>
	</bean>

	
<!-- 下面是配置事务管理器 -->
	<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
	  	<property name="sessionFactory" ref="sessionFactory"/><!-- 将上面的(ref="sessionFactory")交由事务管理器(name="sessionFactory")来管理 -->
	</bean>
	
<!-- 下面是打开注解的支持,并设置了事务管理器 (上面配置的事务管理器)-->	
	<tx:annotation-driven transaction-manager="txManager"/>
	<!-- 下面将bean交给spring容器管理,就可以使用依赖注入的方式来引用bean -->
	<bean id="studentServer" class="server.impl.StudentServerImpl"/>
</beans>

 

分享到:
评论

相关推荐

    Hibernate操作持久化对象

    Hibernate通过将对象模型与关系数据库模型之间的映射进行自动化处理,极大地简化了数据访问层(DAO)的实现,让开发者可以专注于业务逻辑,而非底层的数据库操作。 Hibernate是什么? Hibernate是一个基于JDBC的ORM...

    精通Hibernate:Java对象持久化详解.zip

    Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了Java应用中的数据库操作,使得开发者能够更专注于业务逻辑而不是繁琐的SQL代码。 在Java开发中,持久化是将应用程序中的对象状态保存到持久存储介质...

    精通Hibernate:Java对象持久化技术详解.pdf

    在Hibernate中,实体类代表数据库表,实体类的实例对应表中的记录,属性对应字段,这样就将复杂的SQL操作转化为简单的对象操作。 其次,书中详细讲解了Hibernate的配置。这包括了Hibernate的XML配置文件(hibernate...

    精通Hibernate:Java对象持久化技术详解

    1. **对象关系映射**:Hibernate通过XML配置或注解方式,将Java类与数据库表建立映射关系,使得开发者可以像操作对象一样操作数据库记录。 2. **Session接口**:它是Hibernate的主要工作接口,负责对象的加载、保存...

    Hibernate 操纵持久化对象

    通过使用Hibernate,开发者可以以面向对象的方式操作数据,提高了开发效率和代码的可读性。 **二、持久化对象(Persistent Objects)** 在Hibernate中,持久化对象是指具有与数据库表相对应状态的Java对象。一旦一...

    Hibernate持久化对象的生命周期

    在Java编程中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它使得开发者能够以面向对象的方式处理数据库操作。Hibernate的核心概念之一就是持久化对象的生命周期,这涉及到对象在数据库中的状态及其与...

    hibernate操纵实体对象

    `HibernateSessionFactory.java`以及`BatchUpdateTest.java`这四个文件涵盖了Hibernate中的核心操作和测试场景,它们一起构成了一个完整的数据库操作示例,展示了如何高效地使用Hibernate处理Java实体对象。...

    精通Hibernate:java对象持久化技术

    【精通Hibernate:Java对象持久化技术】主要涵盖了Java应用程序的分层体系结构、软件...通过持续学习和实践,开发者可以更好地掌握Hibernate的高级特性,如懒加载、级联操作、联合查询等,从而在项目中发挥更大的作用。

    hibernate操作数据库笔记

    使用Hibernate的Session对象操作数据库 1.初始化Hibernate:在要使用Hibernate的类的方法中实例化Configuration对象并用Configuration对象的configure()方法将hibernate.cfg.xml中的配置加载到内存,即: ...

    精通Hibernate:Java对象持久化技术详解(第2版)源码1

    通过这些章节的学习,读者不仅可以理解Hibernate的工作原理,还能熟练运用它来实现Java对象的持久化,从而提升数据库操作的效率和便捷性。每章的源码实例将帮助读者更好地理解和实践这些理论知识。

    Hibernate操作数据库的方法

    Hibernate操作数据库时,主要通过以下几个核心组件来实现持久层操作: 1. **Session**:Session是Hibernate用来和数据库进行交互的一个轻量级对象,它相当于JDBC中的Connection。Session对象是应用程序与数据库进行...

    Java 精通Hibernate对象持久化技术权威指南

    《Java精通Hibernate对象持久化技术权威指南》是一本深度探讨Java开发中如何高效地使用Hibernate进行对象持久化的专业书籍。本书旨在帮助Java开发者熟练掌握Hibernate框架,实现数据库操作的简化和自动化,提升软件...

    Hibernate入门到精通

    Hibernate 是一个基于Java的ORM(Object-Relational Mapping,对象关系映射)框架,它提供了一种简洁高效的方式来访问和操作关系数据库。下面是 Hibernate 的主要知识点: Hibernate 简介 Hibernate 是一个开源的...

    hibernate 简单CRUD操作

    总结来说,Hibernate通过提供面向对象的API,极大地降低了数据库操作的复杂性,使得开发人员可以更加专注于业务逻辑,而不是底层的数据访问细节。`testHiberbateJava`项目就是一个很好的学习资源,通过实际操作,你...

    妙解Hibernate 3.x:叩响面向对象思想之门 PDF

    面向对象思想是现代软件开发的重要基石,而Hibernate是这一思想在数据库操作中的体现。本书通过深入浅出的讲解,帮助读者不仅掌握Hibernate的使用,更进一步理解面向对象设计原则,从而在项目开发中更好地应用这些...

    java使用hibernate操作数据库jar

    Java使用Hibernate操作数据库是现代Java应用中常见的技术实践,Hibernate作为一个强大的对象关系映射(ORM)框架,极大地简化了数据库的交互。它允许开发者用Java对象来表示数据库中的记录,而无需关心底层SQL的实现...

    Hibernate 对象持久化

    Hibernate作为一种强大的ORM(对象关系映射)框架,极大地简化了Java应用与数据库之间的交互。它通过将Java类映射到数据库表,实现了对象持久化,使得开发者可以像操作普通Java对象一样处理数据库中的数据,从而降低...

    struts2+hibernate实现登录及增删改操作

    在操作数据时,我们只需操作对象,Hibernate会自动完成与数据库的交互,包括CRUD(创建、读取、更新、删除)操作。 3. **登录功能实现**:在Struts2和Hibernate结合的项目中,登录功能通常涉及用户输入验证、数据库...

Global site tag (gtag.js) - Google Analytics