posts - 15,  comments - 8,  trackbacks - 0
摘要:本文通过一个实例讲述如何通过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"
  "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<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("http://lavasoft.blog.51cto.com/");
    workNote.setOrgId(Long.parseLong("999"));
    workNote.setCreateDate(new Date());
    byte[] b="lavasoft".getBytes();
    workNote.setImage(b);
    officeService.saveWorkNote(workNote);
  }
}

看看测试结果:



posted on 2008-06-04 20:43 lvq810 阅读(674) 评论(0)  编辑  收藏 所属分类: Open Framekwork

只有注册用户登录后才能发表评论。


网站导航: