Hibernate处理一个实体映射多张相同结构的数据表--动态映射
[转自] http://blog.csdn.net/majian_1987/article/details/8725197
LZ在项目中需要处理这样一个业务,每天都有终端设备上传GPS位置信息到服务端,服务端要把GPS位置信息保存在本地,因为每天上传的GPS数据信息会有很多,
所以要把GPS数据按天分别存放在不同的表中,如2013年3月27日上传的GPS数据保存在Disa_GPS_20130327表中,而2013年3月28日上传的GPS数据保存在Disa_GPS_20130328表中,依次类推。这些表的数据结构完全一样,所以LZ想用一个实体去动态映射这些结构相同的表。在网上查了些资料,结果都是需要xml映射文件的,
而LZ用的是hibernate3.x的注解方式实现的映射,当时随便试了下,也没有调通(很惭愧,如果有研究注解方式可以实现的朋友,麻烦共享下,先在这里谢谢了)。所以,又另寻它法。后来在网上又找到了一个通过HQL的基础,SQLQuery实现的动态映射方法,经过LZ实验,终于调通。在此,与各位共享下。
【注】:DIsaGpsdata是实体类,里面要写注解或配置hbm.xml文件。
DisaGpsdata.java:
package com.supermap.earth.server.hibernate.disaster; import java.math.BigDecimal;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
@Entity
@Table(name = "DISA_GPSDATA", schema = "EARTH_DISASTER")
public class DisaGpsdata implements java.io.Serializable { private String id;
private String temId;
private String earthId;
private String userId;
private Double lng;
private Double lat;
private Double secretLng;
private Double secretLat;
private Date gpsTime;
private Double gpsDir;
private Double gpsSpeed; public DisaGpsdata() {
} public DisaGpsdata(String id, String temId, Double lng, Double lat,
Double secretLng, Double secretLat, Date gpsTime, Double gpsDir,
Double gpsSpeed) {
super();
this.id = id;
this.temId = temId;
this.lng = lng;
this.lat = lat;
secretLng = secretLng;
secretLat = secretLat;
this.gpsTime = gpsTime;
this.gpsDir = gpsDir;
this.gpsSpeed = gpsSpeed;
} public DisaGpsdata(String id, String temId, String earthId, String userId,
Double lng, Double lat, Double secretLng, Double secretLat,
Date gpsTime, Double gpsDir, Double gpsSpeed) {
super();
this.id = id;
this.temId = temId;
this.earthId = earthId;
this.userId = userId;
this.lng = lng;
this.lat = lat;
secretLng = secretLng;
secretLat = secretLat;
this.gpsTime = gpsTime;
this.gpsDir = gpsDir;
this.gpsSpeed = gpsSpeed;
} @Id
public String getId() {
return id;
} public void setId(String id) {
this.id = id;
} @Column(name="TEM_ID")
public String getTemId() {
return temId;
} public void setTemId(String temId) {
this.temId = temId;
} public Double getLng() {
return lng;
} public void setLng(Double lng) {
this.lng = lng;
} public Double getLat() {
return lat;
} public void setLat(Double lat) {
this.lat = lat;
} @Column(name="SECRET_LNG")
public Double getSecretLng() {
return secretLng;
} public void setSecretLng(Double secretLng) {
secretLng = secretLng;
} @Column(name="SECRET_LAT")
public Double getSecretLat() {
return secretLat;
} public void setSecretLat(Double secretLat) {
secretLat = secretLat;
} @Temporal(TemporalType.TIMESTAMP)
@Column(name = "GPS_TIME")
public Date getGpsTime() {
return gpsTime;
} public void setGpsTime(Date gpsTime) {
this.gpsTime = gpsTime;
} @Column(name = "GPS_DIR")
public Double getGpsDir() {
return gpsDir;
} public void setGpsDir(Double gpsDir) {
this.gpsDir = gpsDir;
} @Column(name = "GPS_SPEED")
public Double getGpsSpeed() {
return gpsSpeed;
} public void setGpsSpeed(Double gpsSpeed) {
this.gpsSpeed = gpsSpeed;
} @Column(name = "EARTH_ID")
public String getEarthId() {
return earthId;
} public void setEarthId(String earthId) {
this.earthId = earthId;
} @Column(name = "USER_ID")
public String getUserId() {
return userId;
} public void setUserId(String userId) {
this.userId = userId;
} }
1.新增操作:
public void addDisaGpsData(DisaGpsdata data, String tabName)
throws Exception {
Transaction tx = session.beginTransaction();
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
Date date = new Date();
String sql = "insert into disa_gpsdata_"
+ sdf.format(date)
+ " (id, tem_id, lng, lat, gps_time, gps_dir, gps_speed, earth_id, user_id, secret_lng, secret_lat)"
+ " values (?, ?, ?, ?, ?, ?, ?, ?, ?,?,?)"; SQLQuery query = session.createSQLQuery(sql);
query.setString(0,data.getId());
query.setString(1,data.getTemId());
query.setDouble(2,data.getLng());
query.setDouble(3,data.getLat());
query.setDate(4,data.getGpsTime());
query.setDouble(5,data.getGpsDir());
query.setDouble(6,data.getGpsSpeed());
query.setString(7,data.getEarthId());
query.setString(8,data.getUserId());
query.setDouble(9,data.getLng());
query.setDouble(10,data.getLat());
try {
query.executeUpdate();
} catch (Exception e) {
tx.rollback();
e.printStackTrace();
}
tx.commit();
}
2.删除操作:
public void removeDisaGpsDataById(String id, String tabName)
throws Exception {
Transaction tx = session.beginTransaction();
String sql = "delete " + tabName + " where id = ?";
SQLQuery query = session.createSQLQuery(sql);
query.setString(0,id);
try {
query.executeUpdate();
tx.commit();
} catch (Exception e) {
tx.rollback();
e.printStackTrace();
} }
3.查询操作:
注:这里写的是一个DEMO,
public List<DisaGpsdata> queryDisaGpsdatasByPara(Page page, Map map,
String tabName) throws Exception {
List<DisaGpsdata> datas = null;
String sql = "select * from " + tabName
+ " where id = ?"; SQLQuery query = session.createSQLQuery(sql);
query.addEntity(DisaGpsdata.class);
query.setString(0,(String)map.get("id"));
try {
datas = query.list();//返回多条记录的结果集,如果返回一条记录的调用query.uniqueResult();
} catch (Exception e) {
e.printStackTrace();
}
return datas;
}
【总结】:执行查询操作时,需要把查询出来的结果集和实体之间建立映射关系:通过query.addEntity(DisaGpsdata.class);就可以建立表和DisaGpsdata之间的映射关系。
以上便可以实现一个实现DisaGpsdata和多张表之间的动态映射功能。资料参考了【有思想的代码:http://wujuxiang.blog.51cto.com/2250829/403693】,感谢有思想的代码。
另:HibernateSessionFactory类是通过hibernate.cfg.xml配置文件得到的Session工厂,所以要保证hibernate.cfg.xml中一定要含有DisaGpsdata类的映射信息,LZ项目中用的是注解方式,所以在hibernate.cfg.xml中配置的是:
<mapping class="com.supermap.earth.server.hibernate.disaster.DisaGpsdata"/>
如果项目中用的是hbm.xml来映射实体和表之间的关系,则用<mapping resource="*.hbm.xml"/>来引入DisaGpsdata类的映射配置文件,否则报错:org.hibernate.MappingException: Unknown entity:com.supermap.earth.server.hibernate.disaster.DisaGpsdata,这点挺重要,LZ就犯了这个错误,费了好久才找到原因!
Hibernate处理一个实体映射多张相同结构的数据表--动态映射的更多相关文章
- EF——一个实体对应两张表,两个实体对应一张表 06 (转)
本篇日记我们将详细探讨如何将表现领域的类映射到现有的数据库.现在的经济形势不是太好,很多公司都取消了开发新系统的预算.在这种情况下,通常的做法是把原有的几个系统修改一下做个集成,先凑合用着得了.如果要 ...
- 实体类和数据表的映射异常(XXX is not mapping[ ])
在使用SSH框架开发过程,使用hibernate框架提供的工具类实现与数据库数据交互,在执行cmd操作时,如果出现以下异常: org.hibernate.hql.ast.QuerySyntaxExce ...
- Django2.2 Mysql数据表一对一映射(字段绑定) --Model拓展学习笔记shen
我:本次继上次的Model继续延伸一下数据表之间的一对一映射关系 访客:有什么用? 我:众所周知,一张数据表的字段太多会显得冗余.杂乱,那么就需要将一张表进行拆分成多个表,这样不会太杂乱,也比较好维护 ...
- Hibernate表关系映射之一对一映射
一.数据表的映射关系 在数据库领域中,数据表和数据表之间关系一般可以分为如下几种: 一对一:比如公民和身份证的关系,一个人只有一张身份证,同时每张身份证也仅仅对应一个人! 一对多:比如客户和订单之间的 ...
- 如何在MyEclipse中通过hibernate使用jtds驱动连接数据库,并向数据库添加数据的方法
最近学习了下如何在MyEclipse中通过hibernate使用jtds驱动连接数据库,并向数据库添加数据的方法,虽然MyEclipse中自带了连接数据库的方法,我也尝试了下其他方法,如有不当之处请指 ...
- Halo 开源项目学习(二):实体类与数据表
基本介绍 Halo 项目中定义了一些实体类,用于存储博客中的关键数据,如用户信息.文章信息等.在深入学习 Halo 的设计理念与实现过程之前,不妨先学习一下一个完整的博客系统都由哪些元素组成. 实体类 ...
- Phoenix映射HBase数据表
1. 说明 安装好phoenix后对于HBase中已经存在的数据表不会自动进行映射,所以想要再phoenix中操作HBase已有数据表就需要手动进行配置. 2. 创建HBase表 > creat ...
- android 一个SQLite数据库多个数据表的基本使用框架 (带demo)
android 一个SQLite数据库多个数据表(带demo) 前言 demo演示 一.搭建 二.建立实体类 三.建立数据库操作类 ...
- Hibernate之jpa实体映射的三种继承关系
在JPA中,实体继承关系的映射策略共有三种:单表继承策略(table per class).Joined策略(table per subclass)和Table_PER_Class策略. 1.单表继承 ...
随机推荐
- 认识Session
Session在不同环境下的不同含义 session,中文经常翻译为会话,其本来的含义是指有始有终的一系列动作/消息,比如打电话是从拿起电话拨号到挂断电话这中间的一系列过程可以称之为一个session ...
- hdu 4269 Defend Jian Ge
#include <cctype> #include <algorithm> #include <vector> #include <string> # ...
- 金融卡IC卡知识50问
1.什么是金融IC卡? 金融IC卡又称为芯片银行卡,是以芯片作为介质的银行卡.芯片卡容量大,可以存储密钥.数字证书.指纹等信息,其工作原理类似于微型计算机,能够同时处理多种功能,为持卡人提供一卡多用的 ...
- Python基础-5
目录 time &datetime模块 random os sys shutil json & picle shelve xml处理 yaml处理 hashlib re正则表达式 模块 ...
- WCF把书读薄(4)——事务编程与可靠会话
WCF把书读薄(3)——数据契约.消息契约与错误契约 真不愧是老A的书,例子多,而且也讲了不少原理方面的内容,不过越读越觉得压力山大……这次来稍微整理整理事务和可靠会话的内容. 十八.事务编程 WCF ...
- 设计模式07: Bridge 桥接模式(结构型模式)
Bridge 桥接模式(结构型模式) 抽象与实现 抽象不应该依赖于实现细节,实现细节应该依赖于抽象. 抽象B稳定,实现细节b变化 问题在于如果抽象B由于固有的原因,本身并不稳定,也有可能变化,怎么办? ...
- (一)在HTML页面中实现一个简单的Tab
在HTML页面中实现一个简单的Tab 为了充分利用有限的HTML页面空间,经常会采用类似与TabControl的效果通过切换来显示更多的内容.本文将采用一种最为简单的方法来实现类似如Tab页切换的效果 ...
- spring+hibernate工作流程文件名理解
reg.jsp regsuccess.jsp User.java UserDAO.java UserDAOImpl.java User.hbm.xml Reg.java RegImpl.java Re ...
- C# int?
int?:表示可空类型,就是一种特殊的值类型,它的值可以为null用于给变量设初值得时候,给变量(int类型)赋值为null,而不是0int??:用于判断并赋值,先判断当前变量是否为null,如果是就 ...
- C++程序的目录结构、编译、打包、分发
管理C++的第三方库以及编译 第三方库这个说法,不知道出自哪里,但一般是指开发者,系统/平台提供商之外的第三个参与者提供的程序库. 大多数开源软件库在软件系统中都是第三方库. 完全不使用库的开发,在9 ...