论坛首页 Java企业应用论坛

一个电信系统中的实际问题,如何把多个表映射到同一个类?

浏览 7227 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2004-11-02  
在电信系统中,由于数据量大,经常分表
比如,帐单明细bill_detail这个表,就是按帐务月分为很多的表,
结构都一样,只是后缀不同。bill_detail_200409,bill_detail_200410...

我不可能每个表都映射一个对象,这样不现实,
所以,Hibernate 中怎么把结构相同的表映射为一个对象
而且,我在查询时是需要传入 帐务月的

望指点迷津,因为这是电信系统的现实问题
   发表时间:2004-11-02  
你可以使用SQLQuery来完成,在sql中,把表名每次替换为你当前要查询的按月表,例如:

String sql = "select {billdetail.*} from bill_detail_200409 {billdetail}";
Query query = session.createSQLQuery(sql, "billdetail", BillDetail.class);
....
String sql = "select {billdetail.*} from bill_detail_200410 {billdetail}";
Query query = session.createSQLQuery(sql, "billdetail", BillDetail.class);
...
0 请登录后投票
   发表时间:2004-11-02  
查询问题是解决了,可是UPDAE 和 delete呢?

billdetail里有个billmonth属性表示是哪个帐务月的

session.save(billdetail)

hibernate能自动知道UPATE哪个表吗?
或者有什么方法能在SAVE或UPDATE前,
能动态改某个类的映射表名?
0 请登录后投票
   发表时间:2004-11-02  
http://forum.iteye.com/viewtopic.php?t=8320&postdays=0&postorder=asc&start=0

最下面的帖子
0 请登录后投票
   发表时间:2004-11-03  
runtime修改Hibernate configuration必须rebuild sessionfactory。而rebuild sessionfactory就意味着上面提到的那许多潜在的数据不同步。

这个也太。。。不可行了,看来只能等到HIBERNATE3稳定下来

或者有什么别的好的替代方法,欢迎大家热烈讨论 :)

以前好象看到过ROBBIN的一个讨论,自己实现Persistent Class,
在那里可以做到动态改表名吗?
0 请登录后投票
   发表时间:2004-11-03  
用什么实现方法不重要,重要的是你要考虑持久对象在内存中的状态。

上面提到的用SQLQuery的办法其实也不适用于使用Cache的情况。如果你使用了Cache,但是实际上你Query是重定向到另一个表取数据,这意味着你Cache中的数据和Query出来的数据状态是不一致的。所以这种情况下你就不能够使用Cache。而Update的问题更大一些,如果你动态映射不同的表,那么Hibernate没有办法判断持久对象的状态的。

因此这种需求我认为和当前ORM实现的理念是有冲突的地方的,只要动态更改映射,这种内存中的持久对象状态就没有办法判断,因此你不可能期望Hibernate去完美的解决这类问题。
0 请登录后投票
   发表时间:2004-11-04  
在即将发布的LiberaotrJDO数据持久引擎1。2版本中,可以允许在runtime指定对象的表名。

LiberatorJDO提供两个简单的API借口,也用于保存,一个用于query。其他update,attach/detach, delete,批量delete都可以自动识别缓存中对象实际对应的表并保持同步
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics