Hibernate+Spring彻底搞定Clob、Blob的存取
摘要:本文通过一个实例讲述如何通过Spring2+Hibernate3来快捷操作数据库中的Lob字段。
环境:Oracle10g、Srping2、Hibernate3、JUint4
说明:由于时间紧迫,没有详细写出思路。运行一下例子就明白了。
一、创建实体并添加Xdoclet的Hibernate标签
二、通过XDoclet生成Mapping,并修正lob映射的类型为Spring提供的类型
三、通过Mapping 用XDoclet生成数据库(Oracle)脚本,并建表
四、创建DAO层
五、创建带JTA事务控制的业务service层
六、书写单元测试,并运行
看看测试结果:
看到了吧,存进去了,各位周末愉快~~
摘要:本文通过一个实例讲述如何通过Spring2+Hibernate3来快捷操作数据库中的Lob字段。
环境:Oracle10g、Srping2、Hibernate3、JUint4
说明:由于时间紧迫,没有详细写出思路。运行一下例子就明白了。
一、创建实体并添加Xdoclet的Hibernate标签
- /**
- * @author leizhimin
- * @hibernate.mapping default-lazy="false"
- * @hibernate.meta attribute="class-description" value="工作日志"
- * @hibernate.class table="rc_gzrz"
- */
- public class WorkNote {
- private Long id; //标识
- private Date workDate; //日期
- private String weather; //天气
- private String content; //日志内容(Clob)
- private String state; //日志状态
- private Long orgId; //机构id
- private Long userId; //用户id
- private Date createDate; //创建日期
- private byte[] image; //图片
- public static final String WORKNOTE_BLANK = "00"; //未填写
- public static final String WORKNOTE_FULL = "11"; //已填写
- /**
- * @hibernate.id generator-class="sequence" column="BS"
- * @hibernate.meta attribute="field-description" value="标识"
- * @hibernate.generator-param name="sequence" value="SEQ_GW"
- */
- public Long getId() {
- return id;
- }
- public void setId(Long id) {
- this.id = id;
- }
- /**
- * @hibernate.property column="workDate" not-null="false" type="timestamp"
- * @hibernate.meta attribute="field-description" value="工作日期"
- */
- public Date getWorkDate() {
- return workDate;
- }
- public void setWorkDate(Date workDate) {
- this.workDate = workDate;
- }
- /**
- * @hibernate.property column="weather" not-null="false" length="24"
- * @hibernate.meta attribute="field-description" value="天气"
- */
- public String getWeather() {
- return weather;
- }
- public void setWeather(String weather) {
- this.weather = weather;
- }
- /**
- * @hibernate.property column="content" not-null="false" type="text"
- * @hibernate.meta attribute="field-description" value="内容"
- */
- public String getContent() {
- return content;
- }
- public void setContent(String content) {
- this.content = content;
- }
- /**
- * @hibernate.property column="state" not-null="false" length="2"
- * @hibernate.meta attribute="field-description" value="状态"
- */
- public String getState() {
- return state;
- }
- public void setState(String state) {
- this.state = state;
- }
- /**
- * @hibernate.property column="orgId" type="long"
- * @hibernate.meta attribute="field-description" value="机构id"
- */
- public Long getOrgId() {
- return orgId;
- }
- public void setOrgId(Long orgId) {
- this.orgId = orgId;
- }
- /**
- * @hibernate.property column="userId" type="long"
- * @hibernate.meta attribute="field-description" value="用户id"
- */
- public Long getUserId() {
- return userId;
- }
- public void setUserId(Long userId) {
- this.userId = userId;
- }
- /**
- * @hibernate.property column="createDate" not-null="false" type="timestamp"
- * @hibernate.meta attribute="field-description" value="创建日期"
- */
- public Date getCreateDate() {
- return createDate;
- }
- public void setCreateDate(Date createDate) {
- this.createDate = createDate;
- }
- /**
- * @hibernate.property column="image" type="blob" not-null="false"
- * @hibernate.meta attribute="field-description" value="图片"
- */
- public byte[] getImage() {
- return image;
- }
- public void setImage(byte[] image) {
- this.image = image;
- }
- }
二、通过XDoclet生成Mapping,并修正lob映射的类型为Spring提供的类型
- <?xml version="1.0" encoding="gb2312"?>
- <!DOCTYPE hibernate-mapping PUBLIC
- "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
- "[url]http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd[/url]">
- <hibernate-mapping
- default-lazy="false"
- >
- <class
- name="com.topsoft.oa.routine.domain.office.entity.WorkNote"
- table="rc_gzrz"
- >
- <meta attribute="class-description">工作日志</meta>
- <id
- name="id"
- column="BS"
- type="java.lang.Long"
- >
- <meta attribute="field-description">标识</meta>
- <generator class="sequence">
- <param name="sequence">SEQ_GW</param>
- <!--
- To add non XDoclet generator parameters, create a file named
- hibernate-generator-params-WorkNote.xml
- containing the additional parameters and place it in your merge dir.
- -->
- </generator>
- </id>
- <property
- name="workDate"
- type="timestamp"
- update="true"
- insert="true"
- column="workDate"
- not-null="false"
- >
- <meta attribute="field-description">工作日期</meta>
- </property>
- <property
- name="weather"
- type="java.lang.String"
- update="true"
- insert="true"
- column="weather"
- length="24"
- not-null="false"
- >
- <meta attribute="field-description">天气</meta>
- </property>
- <property
- name="content"
- type="org.springframework.orm.hibernate3.support.ClobStringType"
- update="true"
- insert="true"
- column="content"
- not-null="false"
- >
- <meta attribute="field-description">内容</meta>
- </property>
- <property
- name="state"
- type="java.lang.String"
- update="true"
- insert="true"
- column="state"
- length="2"
- not-null="false"
- >
- <meta attribute="field-description">状态</meta>
- </property>
- <property
- name="orgId"
- type="long"
- update="true"
- insert="true"
- column="orgId"
- >
- <meta attribute="field-description">机构id</meta>
- </property>
- <property
- name="userId"
- type="long"
- update="true"
- insert="true"
- column="userId"
- >
- <meta attribute="field-description">用户id</meta>
- </property>
- <property
- name="createDate"
- type="timestamp"
- update="true"
- insert="true"
- column="createDate"
- not-null="false"
- >
- <meta attribute="field-description">创建日期</meta>
- </property>
- <property
- name="image"
- type="org.springframework.orm.hibernate3.support.BlobByteArrayType"
- update="true"
- insert="true"
- column="image"
- not-null="false"
- >
- <meta attribute="field-description">图片</meta>
- </property>
- <!--
- To add non XDoclet property mappings, create a file named
- hibernate-properties-WorkNote.xml
- containing the additional properties and place it in your merge dir.
- -->
- </class>
- </hibernate-mapping>
三、通过Mapping 用XDoclet生成数据库(Oracle)脚本,并建表
- drop table rc_gzrz cascade constraints;
- create table rc_gzrz (
- BS number(19,0) not null,
- workDate timestamp,
- weather varchar2(24 char),
- content clob,
- state varchar2(2 char),
- orgId number(19,0),
- userId number(19,0),
- createDate timestamp,
- image blob,
- primary key (BS)
- );
- comment on table rc_gzrz is
- '工作日志';
- comment on column rc_gzrz.BS is
- '标识';
- comment on column rc_gzrz.workDate is
- '工作日期';
- comment on column rc_gzrz.weather is
- '天气';
- comment on column rc_gzrz.content is
- '内容';
- comment on column rc_gzrz.state is
- '状态';
- comment on column rc_gzrz.orgId is
- '机构id';
- comment on column rc_gzrz.userId is
- '用户id';
- comment on column rc_gzrz.createDate is
- '创建日期';
- comment on column rc_gzrz.image is
- '图片';
四、创建DAO层
- /**
- * Created by IntelliJ IDEA.
- * User: leizhimin
- * Date: 2007-11-16
- * Time: 10:55:50
- * To change this template use File | Settings | File Templates.
- */
- public interface WorkNoteDAO extends CommonDAO {
- /**
- * 根据日期查询工作日志
- *
- * @param workDate 工作日期
- * @param userId 用户id
- * @param orgId 机构id
- * @param sp 分页对象
- * @return List
- */
- public List findWorkNoteByDate(Date workDate, Long userId, Long orgId, SplitPage sp);
- /**
- * 根据状态查询工作日志
- *
- * @param state 日志状态
- * @param userId 用户id
- * @param orgId 机构id
- * @param sp 分页对象
- * @return List
- */
- public List findWorkNoteByState(String state, Long userId, Long orgId, SplitPage sp);
- }
- /**
- * Created by IntelliJ IDEA.
- * User: leizhimin
- * Date: 2007-11-16
- * Time: 10:56:00
- * To change this template use File | Settings | File Templates.
- */
- public class WorkNoteDAOImpl extends CommonDAOImpl implements WorkNoteDAO{
- public List findWorkNoteByDate(Date workDate, Long userId, Long orgId, SplitPage sp) {
- return null;
- }
- public List findWorkNoteByState(String state, Long userId, Long orgId, SplitPage sp) {
- return null;
- }
- }
五、创建带JTA事务控制的业务service层
- /**
- * Created by IntelliJ IDEA.
- * User: leizhimin
- * Date: 2007-11-16
- * Time: 16:43:57
- * To change this template use File | Settings | File Templates.
- */
- public interface OfficeService {
- public void saveWorkNote(WorkNote workNote);
- public void updateWorkNote(WorkNote workNote);
- }
- /**
- * Created by IntelliJ IDEA.
- * User: leizhimin
- * Date: 2007-11-16
- * Time: 16:45:54
- * To change this template use File | Settings | File Templates.
- */
- public class OfficeServiceImpl implements OfficeService{
- private WorkNoteDAO workNoteDAO;
- public WorkNoteDAO getWorkNoteDAO() {
- return workNoteDAO;
- }
- public void setWorkNoteDAO(WorkNoteDAO workNoteDAO) {
- this.workNoteDAO = workNoteDAO;
- }
- public void saveWorkNote(WorkNote workNote) {
- this.workNoteDAO.saveObject(workNote);
- }
- public void updateWorkNote(WorkNote workNote) {
- this.workNoteDAO.updateObject(workNote);
- }
- }
六、书写单元测试,并运行
- /**
- * Created by IntelliJ IDEA.
- * User: leizhimin
- * Date: 2007-11-16
- * Time: 16:49:17
- * To change this template use File | Settings | File Templates.
- */
- public class TestOffice extends TestCase {
- public void test_worknote_save(){
- OfficeService officeService = (OfficeService) ContextHelper.getContext().getBean("officeServiceProxy");
- WorkNote workNote=new WorkNote();
- workNote.setContent("[url]http://lavasoft.blog.51cto.com/[/url]");
- workNote.setOrgId(Long.parseLong("999"));
- workNote.setCreateDate(new Date());
- byte[] b="lavasoft".getBytes();
- workNote.setImage(b);
- officeService.saveWorkNote(workNote);
- }
- }
看看测试结果:
看到了吧,存进去了,各位周末愉快~~