Photo.java
- import java.sql.Blob;
- import java.sql.Clob;
- import java.util.Date;
- /**
- * @author IBM 这是一个用于测试Hibernate大对象操作的PO
- *
- * 这是一个测试POJO, 属性有多种类型
- */
- public class Photo {
- private Long id;
- private String fileName="";// 文件名
- private Date date = new Date(); // 主库时间,默认值是当前时间
- private Blob photo;// 相片的二进制形式,大对象
- private Clob text;// 文字说明,大对象
- private byte[] bin;//字节数组
- }
import java.sql.Blob; import java.sql.Clob; import java.util.Date; /** * @author IBM 这是一个用于测试Hibernate大对象操作的PO * * 这是一个测试POJO, 属性有多种类型 */ public class Photo { private Long id; private String fileName="";// 文件名 private Date date = new Date(); // 主库时间,默认值是当前时间 private Blob photo;// 相片的二进制形式,大对象 private Clob text;// 文字说明,大对象 private byte[] bin;//字节数组 }
Photo.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 package="test.com.base">
- <class name="Photo" table="test_Photo">
- <id name="id">
- <generator class="native"/>
- </id>
- <property name="fileName" />
- <property name="date" />
- <property name="photo" />
- <property name="text" />
- <property name="bin" />
- </class>
- </hibernate-mapping>
<?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 package="test.com.base"> <class name="Photo" table="test_Photo"> <id name="id"> <generator class="native"/> </id> <property name="fileName" /> <property name="date" /> <property name="photo" /> <property name="text" /> <property name="bin" /> </class> </hibernate-mapping>
PhotoManagerImpl.java
其中继承了BaseDao类,这是一个通用Hibernate 泛型DAO工具类
- package test.com.base;
- import java.io.File;
- import java.io.FileOutputStream;
- import java.io.InputStream;
- import java.io.OutputStream;
- import java.io.Reader;
- import java.nio.CharBuffer;
- import java.sql.Clob;
- import org.springframework.stereotype.Service;
- import org.springframework.transaction.annotation.Transactional;
- import com.base.dao.BaseDao;
- @Transactional
- @Service
- public class PhotoManagerImpl extends BaseDao<Photo,Long> {
- //空
- }
package test.com.base; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.io.Reader; import java.nio.CharBuffer; import java.sql.Clob; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.base.dao.BaseDao; @Transactional @Service public class PhotoManagerImpl extends BaseDao<Photo,Long> { //空 }
BaseDaoBlobClobTest.java
其中用到了JUnitBase_svc类,作用是加载spring的配置文件
- package test.com.base;
- import java.io.File;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.OutputStream;
- import java.io.Reader;
- import java.sql.Blob;
- import java.sql.Clob;
- import javax.annotation.Resource;
- import org.hibernate.Hibernate;
- import org.hibernate.LockMode;
- import org.hibernate.Session;
- import org.hibernate.Transaction;
- import org.junit.Test;
- import com.base.dao.BaseDao;
- /**
- * 通过个单元测试,演示了<br/>
- * 1: 如何操作大象<br/>
- * 2:懒加载的一种解决方案<br/>
- */
- public class BaseDaoBlobClobTest extends JUnitBase_svc {
- @Resource
- private PhotoManagerImpl photoManagerImpl;
- /**
- * 测试保存大对象
- */
- @Test
- public void TestSaveBlob() {
- // ----------456.jpg 转成Blob--------------------
- InputStream in = this.getClass().getResourceAsStream("phtot.jpg");
- Blob blob = null;
- try {
- blob = Hibernate.createBlob(in);
- } catch (IOException e) {
- e.printStackTrace();
- }
- // ----------文字 转成Clob--------------------
- Clob clob = Hibernate.createClob("文字 转成Clob");
- // ------------------------------------------
- Photo photo = new Photo();
- photo.setFileName("haha.jpg");
- photo.setPhoto(blob);
- photo.setText(clob);
- photoManagerImpl.save(photo);
- }
- /**
- * 测试取得大对象,没有使用懒加载,
- */
- @Test
- public void TestGetBlob() {
- Photo photo = photoManagerImpl.get(3L);// 执行Hibername的get方法,会马上执行SQL查询
- int len = 0;
- byte[] buf = new byte[1024];
- try {
- String path = "d:\\abc.jpg";// 取出图片后保存的位置
- InputStream in = photo.getPhoto().getBinaryStream();
- OutputStream out = new FileOutputStream(new File(path));
- while ((len = in.read(buf)) > 0) {
- out.write(buf, 0, len);
- }
- out.close();
- in.close();
- System.out.println("读出的图片放在了:" + path);
- Clob clob = photo.getText();
- Reader reader = clob.getCharacterStream();
- char[] cb = new char[1024];
- StringBuffer sb = new StringBuffer();
- len = 0;
- while ((len = reader.read(cb)) > 0) {
- sb.append(cb, 0, len);
- }
- System.out.println(sb.toString());
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- /**
- * 测试取得大对象,使用了懒加载,
- *
- * 并且是在事务已提交,session已关闭后才通过Hibernate代理查出的目标对象
- *
- * 这是懒加载的一种解决方案,很重要,特此说明
- */
- @Test
- public void TestLoadBlob() {
- // 执行的是load方法,会延迟加载,返回Hibernate代理对象之后session已关闭
- Photo photo = photoManagerImpl.load(3L);
- //打开一个新Session,不能使用getCurrentSession()方法
- Session session = photoManagerImpl.getNewSession();
- System.out.println("Session是打开的吗:"+session.isOpen());
- // 把Hibernate代理对象重新关联到一个session对象
- session.lock(photo, LockMode.NONE);
- //开启事务
- Transaction t=session.beginTransaction();
- int len = 0;
- byte[] buf = new byte[1024];
- try {
- String path = "d:\\abc.jpg";// 取出图片后保存的位置
- //这时才发出sql语句,执行查询,达到了懒加载的目的
- InputStream in = photo.getPhoto().getBinaryStream();
- OutputStream out = new FileOutputStream(new File(path));
- while ((len = in.read(buf)) > 0) {
- out.write(buf, 0, len);
- }
- out.close();
- in.close();
- System.out.println("读出的图片放在了:" + path);
- Clob clob = photo.getText();
- Reader reader = clob.getCharacterStream();
- char[] cb = new char[1024];
- StringBuffer sb = new StringBuffer();
- len = 0;
- while ((len = reader.read(cb)) > 0) {
- sb.append(cb, 0, len);
- }
- ;
- System.out.println(sb.toString());
- } catch (Exception e) {
- e.printStackTrace();
- }
- System.out.println(t==session.getTransaction());
- //提交事务
- session.getTransaction().commit();
- //关闭
- session.close();
- }
- }