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&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通过将对象模型与关系数据库模型之间的映射进行自动化处理,极大地简化了数据访问层(DAO)的实现,让开发者可以专注于业务逻辑,而非底层的数据库操作。 Hibernate是什么? Hibernate是一个基于JDBC的ORM...
Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了Java应用中的数据库操作,使得开发者能够更专注于业务逻辑而不是繁琐的SQL代码。 在Java开发中,持久化是将应用程序中的对象状态保存到持久存储介质...
在Hibernate中,实体类代表数据库表,实体类的实例对应表中的记录,属性对应字段,这样就将复杂的SQL操作转化为简单的对象操作。 其次,书中详细讲解了Hibernate的配置。这包括了Hibernate的XML配置文件(hibernate...
1. **对象关系映射**:Hibernate通过XML配置或注解方式,将Java类与数据库表建立映射关系,使得开发者可以像操作对象一样操作数据库记录。 2. **Session接口**:它是Hibernate的主要工作接口,负责对象的加载、保存...
通过使用Hibernate,开发者可以以面向对象的方式操作数据,提高了开发效率和代码的可读性。 **二、持久化对象(Persistent Objects)** 在Hibernate中,持久化对象是指具有与数据库表相对应状态的Java对象。一旦一...
在Java编程中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它使得开发者能够以面向对象的方式处理数据库操作。Hibernate的核心概念之一就是持久化对象的生命周期,这涉及到对象在数据库中的状态及其与...
`HibernateSessionFactory.java`以及`BatchUpdateTest.java`这四个文件涵盖了Hibernate中的核心操作和测试场景,它们一起构成了一个完整的数据库操作示例,展示了如何高效地使用Hibernate处理Java实体对象。...
【精通Hibernate:Java对象持久化技术】主要涵盖了Java应用程序的分层体系结构、软件...通过持续学习和实践,开发者可以更好地掌握Hibernate的高级特性,如懒加载、级联操作、联合查询等,从而在项目中发挥更大的作用。
使用Hibernate的Session对象操作数据库 1.初始化Hibernate:在要使用Hibernate的类的方法中实例化Configuration对象并用Configuration对象的configure()方法将hibernate.cfg.xml中的配置加载到内存,即: ...
通过这些章节的学习,读者不仅可以理解Hibernate的工作原理,还能熟练运用它来实现Java对象的持久化,从而提升数据库操作的效率和便捷性。每章的源码实例将帮助读者更好地理解和实践这些理论知识。
Hibernate操作数据库时,主要通过以下几个核心组件来实现持久层操作: 1. **Session**:Session是Hibernate用来和数据库进行交互的一个轻量级对象,它相当于JDBC中的Connection。Session对象是应用程序与数据库进行...
《Java精通Hibernate对象持久化技术权威指南》是一本深度探讨Java开发中如何高效地使用Hibernate进行对象持久化的专业书籍。本书旨在帮助Java开发者熟练掌握Hibernate框架,实现数据库操作的简化和自动化,提升软件...
Hibernate 是一个基于Java的ORM(Object-Relational Mapping,对象关系映射)框架,它提供了一种简洁高效的方式来访问和操作关系数据库。下面是 Hibernate 的主要知识点: Hibernate 简介 Hibernate 是一个开源的...
总结来说,Hibernate通过提供面向对象的API,极大地降低了数据库操作的复杂性,使得开发人员可以更加专注于业务逻辑,而不是底层的数据访问细节。`testHiberbateJava`项目就是一个很好的学习资源,通过实际操作,你...
面向对象思想是现代软件开发的重要基石,而Hibernate是这一思想在数据库操作中的体现。本书通过深入浅出的讲解,帮助读者不仅掌握Hibernate的使用,更进一步理解面向对象设计原则,从而在项目开发中更好地应用这些...
Java使用Hibernate操作数据库是现代Java应用中常见的技术实践,Hibernate作为一个强大的对象关系映射(ORM)框架,极大地简化了数据库的交互。它允许开发者用Java对象来表示数据库中的记录,而无需关心底层SQL的实现...
Hibernate作为一种强大的ORM(对象关系映射)框架,极大地简化了Java应用与数据库之间的交互。它通过将Java类映射到数据库表,实现了对象持久化,使得开发者可以像操作普通Java对象一样处理数据库中的数据,从而降低...
在操作数据时,我们只需操作对象,Hibernate会自动完成与数据库的交互,包括CRUD(创建、读取、更新、删除)操作。 3. **登录功能实现**:在Struts2和Hibernate结合的项目中,登录功能通常涉及用户输入验证、数据库...