hibernate 动态生成表
来源:互联网 发布:Linux netstat -i 编辑:程序博客网 时间:2024/05/04 11:39
privateInteger userId;
private Integer year;
private Integer month;
private Integer day;
private Integerpoint;
那么相应的 ReadInfo.hbm.xml 的片段是
<class name="ReadInfo" table="tblReadInfo"mutable="false">
<composite-id>
<key-property name="userId" column="userId" type="integer"/>
<key-property name="year" column="year" type="integer"/>
<key-property name="month" column="month" type="integer"/>
<key-property name="day" column="day" type="integer"/>
</composite-id>
<property name="point" column="point" type="integer"/>
</class>
上面的xml,注意 2 个细节
1. pojo 所映射的 table tblReadInfo 实际上是不存在的。实际的表是 tblRead200710 之类的;
2. mutable 要设置为 false,即是说,关闭 hibernate 对这个 pojo 的任何持久化操作,以避免 hibernate 把数据写到 tblReadInfo 中(这个表是不存在的嘛)。因此,所有的持久化操作,都是需要自己通过 SQLQuery 来处理。
现在可以看一下 ado 中的操作了,先看一个 select 操作
public ReadInfo selectReadInfo(Integer userId,Integer year,
Integer month, Integer day) throws HibernateException
{
ReadInfo readInfo = null;
Session session = getSession();
Transaction tx = session.beginTransaction();
try
{
String sql = "select * from tblRead"
+ Misc.formatMoon(year, month)
+ " where userId=? and day=?";
SQLQuery query = session.createSQLQuery(sql);
query.addEntity(ReadInfo.class);
query.setLong(0, userId);
query.setInteger(1, day);
readInfo = (ReadInfo)query.uniqueResult();
tx.commit();
}
catch (HibernateException e)
{
log.error("catch exception:", e);
if (tx != null)
{
tx.rollback();
}
throw e;
}
return readInfo;
}
上面的代码,关键是以下几点:
1. 通过函数参数的 year, month 来确定要操作的表名,我自己写了一个 Misc.formatMoon(year, month) 来生成 "yyyyMM" 格式的字串;
2. 使用了 SQLQuery ,再通过 query.addEntity(ReadInfo.class); 建立与 ReadInfo 的映射关系;
3. query.setXxx() 与 PreparedStatement 的类似,不过索引是从 0 开始;
4. 其它的就跟一般的 Query 操作类似的了。
再看一个 insert 操作
publicvoid insertReadInfo(ReadInfo readInfo)throws HibernateException
{
Session session = getSession();
Transaction tx = session.beginTransaction();
try
{
String sql = "insert into tblRead"
+ Misc.formatMoon(readInfo.getYear(), readInfo.getMonth())
+ " (userId, year, month, day, point) values (?, ?, ?, ?, ?)";
SQLQuery query = session.createSQLQuery(sql);
query.setLong(0, readInfo.getUserId());
query.setInteger(1, readInfo.getYear());
query.setInteger(2, readInfo.getMonth());
query.setInteger(3, readInfo.getDay());
query.setInteger(4, readInfo.getPoint());
query.executeUpdate();
tx.commit();
}
catch (HibernateException e)
{
log.error("catch exception:", e);
if (tx != null)
{
tx.rollback();
}
throw e;
}
}
同理,update, delete 等操作也是这样实现的。
hmm.. 这种处理方式的麻烦的地方是需要手工写 sql ,因此要尽量写通用的标准 sql,不然在数据库兼容方面会有问题。当然,有时是会出现无法兼容的情况,那么可以考虑把 sql 写到配置文件中,根据不同的数据库,装载相应的配置文件咯。
- hibernate 动态生成表
- hibernate 动态生成表
- hibernate 动态生成表
- hibernate 动态生成HQL
- hibernate动态生成SQL
- hibernate之动态生成SQL
- JSF+Hibernate 显示动态生成的表中的内容
- Hibernate--使用setProperties()方法动态生成
- Hibernate自动生成表
- hibernate 自动生成表
- 根据hibernate生成表
- Hibernate初始化生成表
- 根据hibernate生成表
- hibernate 注解生成表
- hibernate 生成表
- Hibernate自动生成表
- 单独hibernate 生成表
- hibernate 生成表
- HBase命令
- 第三章:Creating Applications and activities-(五)理解应用的优先级以及进程状态
- int转string string转int
- 第三章:Creating Applications and activities-(六)外部资源
- A simple asp
- hibernate 动态生成表
- VC2005的程序文件分发问题及解决
- 我碰到的编程陷阱
- fedora搭建xampp
- BAS和SR设备
- MSSQL数据库游标
- 一起来学设计模式(3)——工厂模式
- connman简介
- 守护进程测试