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:

[java]  view plain copy
  1. package com.supermap.earth.server.hibernate.disaster;  
  2.   
  3. import java.math.BigDecimal;  
  4. import java.util.Date;  
  5. import javax.persistence.Column;  
  6. import javax.persistence.Entity;  
  7. import javax.persistence.Id;  
  8. import javax.persistence.Table;  
  9. import javax.persistence.Temporal;  
  10. import javax.persistence.TemporalType;  
  11. @Entity  
  12. @Table(name = "DISA_GPSDATA", schema = "EARTH_DISASTER")  
  13. public class DisaGpsdata implements java.io.Serializable {  
  14.   
  15.     private String id;  
  16.     private String temId;  
  17.     private String earthId;  
  18.     private String userId;  
  19.     private Double lng;  
  20.     private Double lat;  
  21.     private Double secretLng;  
  22.     private Double secretLat;  
  23.     private Date gpsTime;  
  24.     private Double gpsDir;  
  25.     private Double gpsSpeed;  
  26.       
  27.     public DisaGpsdata() {  
  28.     }  
  29.   
  30.     public DisaGpsdata(String id, String temId, Double lng, Double lat,  
  31.             Double secretLng, Double secretLat, Date gpsTime, Double gpsDir,  
  32.             Double gpsSpeed) {  
  33.         super();  
  34.         this.id = id;  
  35.         this.temId = temId;  
  36.         this.lng = lng;  
  37.         this.lat = lat;  
  38.         secretLng = secretLng;  
  39.         secretLat = secretLat;  
  40.         this.gpsTime = gpsTime;  
  41.         this.gpsDir = gpsDir;  
  42.         this.gpsSpeed = gpsSpeed;  
  43.     }  
  44.   
  45.     public DisaGpsdata(String id, String temId, String earthId, String userId,  
  46.             Double lng, Double lat, Double secretLng, Double secretLat,  
  47.             Date gpsTime, Double gpsDir, Double gpsSpeed) {  
  48.         super();  
  49.         this.id = id;  
  50.         this.temId = temId;  
  51.         this.earthId = earthId;  
  52.         this.userId = userId;  
  53.         this.lng = lng;  
  54.         this.lat = lat;  
  55.         secretLng = secretLng;  
  56.         secretLat = secretLat;  
  57.         this.gpsTime = gpsTime;  
  58.         this.gpsDir = gpsDir;  
  59.         this.gpsSpeed = gpsSpeed;  
  60.     }  
  61.       
  62.     @Id  
  63.     public String getId() {  
  64.         return id;  
  65.     }  
  66.   
  67.     public void setId(String id) {  
  68.         this.id = id;  
  69.     }  
  70.       
  71.     @Column(name="TEM_ID")  
  72.     public String getTemId() {  
  73.         return temId;  
  74.     }  
  75.   
  76.     public void setTemId(String temId) {  
  77.         this.temId = temId;  
  78.     }  
  79.       
  80.     public Double getLng() {  
  81.         return lng;  
  82.     }  
  83.   
  84.     public void setLng(Double lng) {  
  85.         this.lng = lng;  
  86.     }  
  87.   
  88.     public Double getLat() {  
  89.         return lat;  
  90.     }  
  91.   
  92.     public void setLat(Double lat) {  
  93.         this.lat = lat;  
  94.     }  
  95.       
  96.     @Column(name="SECRET_LNG")  
  97.     public Double getSecretLng() {  
  98.         return secretLng;  
  99.     }  
  100.   
  101.     public void setSecretLng(Double secretLng) {  
  102.         secretLng = secretLng;  
  103.     }  
  104.   
  105.     @Column(name="SECRET_LAT")  
  106.     public Double getSecretLat() {  
  107.         return secretLat;  
  108.     }  
  109.   
  110.     public void setSecretLat(Double secretLat) {  
  111.         secretLat = secretLat;  
  112.     }  
  113.       
  114.     @Temporal(TemporalType.TIMESTAMP)  
  115.     @Column(name = "GPS_TIME")  
  116.     public Date getGpsTime() {  
  117.         return gpsTime;  
  118.     }  
  119.   
  120.     public void setGpsTime(Date gpsTime) {  
  121.         this.gpsTime = gpsTime;  
  122.     }  
  123.       
  124.     @Column(name = "GPS_DIR")  
  125.     public Double getGpsDir() {  
  126.         return gpsDir;  
  127.     }  
  128.   
  129.     public void setGpsDir(Double gpsDir) {  
  130.         this.gpsDir = gpsDir;  
  131.     }  
  132.       
  133.     @Column(name = "GPS_SPEED")  
  134.     public Double getGpsSpeed() {  
  135.         return gpsSpeed;  
  136.     }  
  137.   
  138.     public void setGpsSpeed(Double gpsSpeed) {  
  139.         this.gpsSpeed = gpsSpeed;  
  140.     }  
  141.       
  142.     @Column(name = "EARTH_ID")  
  143.     public String getEarthId() {  
  144.         return earthId;  
  145.     }  
  146.   
  147.     public void setEarthId(String earthId) {  
  148.         this.earthId = earthId;  
  149.     }  
  150.       
  151.     @Column(name = "USER_ID")  
  152.     public String getUserId() {  
  153.         return userId;  
  154.     }  
  155.   
  156.     public void setUserId(String userId) {  
  157.         this.userId = userId;  
  158.     }  
  159.       
  160. }  


 

1.新增操作:

[java]  view plain copy
  1. public void addDisaGpsData(DisaGpsdata data, String tabName)  
  2.             throws Exception {  
  3.         Transaction tx = session.beginTransaction();  
  4.         SimpleDateFormat sdf =   new SimpleDateFormat("yyyyMMdd");  
  5.         Date date = new Date();  
  6.         String sql = "insert into disa_gpsdata_"   
  7.               + sdf.format(date)   
  8.               + " (id, tem_id, lng, lat, gps_time, gps_dir, gps_speed, earth_id, user_id, secret_lng, secret_lat)"  
  9.               + "  values (?, ?, ?, ?, ?, ?, ?, ?, ?,?,?)";  
  10.           
  11.         SQLQuery query = session.createSQLQuery(sql);  
  12.         query.setString(0,data.getId());  
  13.         query.setString(1,data.getTemId());  
  14.         query.setDouble(2,data.getLng());  
  15.         query.setDouble(3,data.getLat());  
  16.         query.setDate(4,data.getGpsTime());  
  17.         query.setDouble(5,data.getGpsDir());  
  18.         query.setDouble(6,data.getGpsSpeed());  
  19.         query.setString(7,data.getEarthId());  
  20.         query.setString(8,data.getUserId());  
  21.         query.setDouble(9,data.getLng());  
  22.         query.setDouble(10,data.getLat());  
  23.         try {  
  24.             query.executeUpdate();  
  25.         } catch (Exception e) {  
  26.             tx.rollback();  
  27.             e.printStackTrace();  
  28.         }  
  29.         tx.commit();  
  30.     }  


2.删除操作:

[java]  view plain copy
  1. public void removeDisaGpsDataById(String id, String tabName)  
  2.             throws Exception {  
  3.         Transaction tx = session.beginTransaction();  
  4.         String sql = "delete " + tabName + "  where id = ?";  
  5.         SQLQuery query = session.createSQLQuery(sql);  
  6.         query.setString(0,id);  
  7.         try {  
  8.             query.executeUpdate();  
  9.             tx.commit();  
  10.         } catch (Exception e) {  
  11.             tx.rollback();  
  12.             e.printStackTrace();  
  13.         }  
  14.           
  15.     }  


3.查询操作:

注:这里写的是一个DEMO,

[java]  view plain copy
  1. public List<DisaGpsdata> queryDisaGpsdatasByPara(Page page, Map map,  
  2.             String tabName) throws Exception {  
  3.         List<DisaGpsdata> datas = null;  
  4.         String sql = "select * from  " + tabName   
  5.                     + "  where id = ?";  
  6.           
  7.         SQLQuery query = session.createSQLQuery(sql);  
  8.         query.addEntity(DisaGpsdata.class);  
  9.         query.setString(0,(String)map.get("id"));  
  10.         try {  
  11.             datas = query.list();//返回多条记录的结果集,如果返回一条记录的调用query.uniqueResult();  
  12.         } catch (Exception e) {  
  13.             e.printStackTrace();  
  14.         }  
  15.         return datas;  
  16.     }  


【总结】:执行查询操作时,需要把查询出来的结果集和实体之间建立映射关系:通过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动态表名映射--只有想不到,没有做不到

http://www.2cto.com/kf/201409/339525.html

最近的一个项目有一个需求,有N个考核单位,要对每个考核单位生成一张考核情况表,这样做的目的是横切数据库,这这个需求的实现中,我的组员遇到了一个技术问题,我将我的解决办法和整个思考过程与大家分享,


思路:

用一个配置文件,一个类去映射多个表,(每个表的结构相同)。按照平时的做法,有多少个表就要 写多少个配置文件,岂不是很麻烦。怎样才能只写一个配置文件就能达到上述目的呢? 经过研究,发现Hibernate中的NamingStrategy可以达到这个目的。它是用来定义表名和列名映射规 则的一个接口。我们要通过实现这个接口来实现自己的命名策略。这个接口中包含的十个方法,其中的 public String classToTableName(String className)是通过类名来映射表名的。实现我们的想法就要用 到这个方法。好了,下面来看怎么做:


步骤:

1、自定义一个类MyNamingStrategy来实现NamingStrategy。(这样你要实现10个方法,如果其他方法 不需要,我们可以通过继承它的一个适配器类DefaultNamingStrategy来只实现我们需要的方法)好了,我 们就继承DefaultNamingStrategy 吧。 


2、实现public String classToTableName(String className)方法来实现自己命名策略。 


我这的业务需要是每隔一个月就要换一个表。比如1月用biz_1,那么2月就用biz_2….但是这些表的结构是相同的。我们要做的就是通过获得月份来动态的选择表。我们从这个方法中这样写: 


?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<span style= "font-size:18px;" > /**
  *这个类是重新定义一个hibernate的命名规范
**/
public class MyNamingStrategy extends DefaultNamingStrategy {
 
     //这是为了实现单例
     public static final MyNamingStrategy INSTANCE = new MyNamingStrategy();
 
     
     //重新定义名称映射关系
     public String classToTableName(String className) {
 
         //自己的名称定义规则
         return “biz_” + Calendar.getInstance().get(Calendar.DAY_OF_MONTH);
 
 
     }
 
} </span>



好了,这样就可以根据月份来动态的选择表名了。 


3、使用命名策略。 


要使用这个命名策略可以这样: 


?
1
2
3
4
<span style= "font-size:18px;" >Configuration cfg = new Configuration()
     .setNamingStrategy(MyNamingStrategy.INSTANCE)
     .configure(“hibernate.cfg.xml”)
     .addFile(“biz.hbm.xml”); </span>






ok,这样就可以实现我们的动态表名映射啦!


总结:

很多时候,我是经常被自己的思维所束缚,这是我的一种思维惯性,而且我只要找到一种解决问题的方法,就会当作宝典收藏,别人有比你好的,也会有种排斥的信息,二者恰恰是阻碍我们进步的牢笼,我们应该冲破这曾牢笼,我们应该更大胆些,想到且看到我们和以前截然不同的一面!



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Hibernate一个Java持久化框架,它能够将Java对象映射到数据库中的格,同时支持各种关系数据库,如MySQL、Oracle等。在Hibernate中,对于一对一、一对多和多对多的关系,我们可以通过以下方式进行映射。 一对一关系:在Hibernate中,可以通过主键关联和外键关联来实现一对一关系的映射。主键关联是指两个实体之间的关联通过主键来进行,可以使用@PrimaryKeyJoinColumn注解将两个实体关联起来。外键关联是指通过一个实体引用另一个实体的主键作为外键,使用@JoinColumn注解来指定外键属性。 一对多关系:在Hibernate中,一对多关系通常通过外键关联来实现。在一的一方,使用@OneToMany注解来定义一对多关系,同时使用@JoinColumn注解指定外键属性。在多的一方,使用@ManyToOne注解来定义多对一关系,并使用@JoinColumn注解指定外键属性。 多对多关系:在Hibernate中,多对多关系通常通过中间来实现。在多对多的两个实体中,使用@ManyToMany注解来定义多对多关系。同时,需要在中间中创建两个外键,分别与两个实体的主键关联,并使用@JoinTable注解来指定中间表名和两个外键的列名。 总结:通过Hibernate的注解方式,可以方便地实现一对一、一对多和多对多关系的映射。通过合理地使用注解,可以减少编写映射文件的工作量,提高开发效率。同时,Hibernate还提供了在运行时自动生成结构的功能,可以根据Java实体类来动态创建或更新对应的数据库格,从而提高系统的可维护性和灵活性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值