摘要:本文通过一个实例讲述如何通过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);
}
}
六、在SessionFactory中注入LobHandler
在SessionFactory中注入LobHandler,这里注入的是Oracle的handler。
<bean id="nativeJdbcExtractor" class="org.springframework.jdbc.support.nativejdbc.SimpleNativeJdbcExtractor" lazy-init="true">
</bean>
<bean id="lobHandler" class="org.springframework.jdbc.support.lob.OracleLobHandler" lazy-init="true">
<property name="nativeJdbcExtractor">
<ref local="nativeJdbcExtractor" />
</property>
</bean>
<bean id="hibernateSF"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="lobHandler">
<ref local="lobHandler"/>
</property>
<property name="configLocation">
<value>classpath:config/hibernate.cfg.xml</value>
</property>
</bean>
七、书写单元测试,并运行
/**
* 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);
}
}
看看测试结果:
看到了吧,存进去了,各位周末愉快~~