SQLQuery实现动态表映射

节选自:《Hibernate开发与实战》(刘伟、张利国,电子工业出版社,2009.9)

有时候需要动态操作表的数据。如通过数据库记录日志信息时每个月产生一张日志表,结构都一样只是表名不同。表名取log200902等。可以利用SQLQuery对象的addEntity()动态关联持久化类和数据库表。

1.oracle表

1 create table log201112(
2 id number(8) not null,
3 content varchar2(1000),
4 create_time varchar2(20) not null,
5 primary key(id)
6 );
7 create sequence log_seq start with 1 increment by 1;

2..映射文件中mutable=false ,table为虚的

 1 <?xml version="1.0" encoding="UTF-8"?>
2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD3.0//EN"
3 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >

4 <hibernate-mapping>
5 <class name="com.tazi.domin.Log" table="log" mutable="false">
6 <id name="id" type="java.lang.Integer">
7 <column name="ID"/>
8 <generator class="increment"/>
9 </id>
10 <property name="content" type="string" column="CONTENT"/>
11 <property name="createTime" type="java.util.Date" column="CREATE_TIME"/>
12 </class>
13 </hibernate-mapping>

3.保存数据

 1 public void save(Log log){
2 Session session=getSession();//自定义方法,事务的开启和提交在其他地方控制
3 DateFormat df=new SimpleDateFormat("yyyyMM");

4 String sql="insert into log"+df.format(new Date())+
5 "(id,content,create_time) values(log_seq.nextval,?,?)";
6 SQLQuery query=session.createSQLQuery(sql);
7 query.setString(0, log.getContent());
8 query.setTimestamp(1, log.getCreateTime());//如果用setDate只会保存年月信息
9 query.executeUpdate();
10 }

4.获取

 1 public Log getLog(Integer id){
2 Session session=getSession();
3 DateFormat df=new SimpleDateFormat("yyyyMM");
4 String sql="select log.* from log"+df.format(new Date())+
5 " log where id=?";
6 SQLQuery query=session.createSQLQuery(sql);
7 query.setInteger(0, id);
8 query.addEntity("log",Log.class);
9 Log log=(Log)query.uniqueResult();
10 return log;
11 }





posted @ 2011-12-20 09:56  tazi  阅读(860)  评论(0编辑  收藏  举报