论坛首页 Java企业应用论坛

求一种Hibernate的对象的关系的设计

浏览 3667 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-06-07  
现在有一个TbFinancial的VO,存入账出账的记录

class TbFinancial
{
  Integer id ,fk_id;
  String type ;
  Float number;  //这里是入账或出账的金额
}


有一个TbSale, 存门市的销售记录

class TbSale
{
  Integer id;
  TbProduct product;
  TbClient client;
  Float productAmount;
  Float totalPaid;
}


如果从表的关系来说, financial表是通过type和fk_id字段, 来关联到sale表的某条记录, 从而计算出入账或出出账数目的,sql如下:

select fk_id,type from financial f where type='门市销售' left outter join (select * from sales s) where f.fk_id=s.id


如果financial表关联到退货记录表 refund ,sql就是这样的
select fk_id,type from financial f where type='退货记录' left outter join (select * from refund r) where f.fk_id=r.id


这样通过type和fk_id来与其它表连接的话,就保证了financial表的通用性, 但是用sql就容易搞定,如果转成Hibernate对象,遇到两个问题

1 TbFinancial对象的属性中,应该包括其它表的VO, 但这个VO的类型是不确定的,有可能是TbSale, 有可能是TbRefund,这怎么配置呢?

2 TbFinancial对象和其它VO的关系, 不是one-to-many, 也不是many-to-one, 也不是many-to-many,是one-to-one吗?

像这种问题, 请教一下有丰富hibernate经验的朋友,看看怎么解决,谢谢.
   发表时间:2007-06-07  
这似乎是any映射的极好的应用场景。
0 请登录后投票
   发表时间:2007-06-08  
感觉lz的TbFinancial包括两种不同的对象,似乎在设计上存在问题,建议还是把两种对象分开放在两个不同的数据表中。
0 请登录后投票
   发表时间:2007-06-08  
1.去看hibernate里继承那一章
2.用不用继承,都应该是一对一,不过可以配成多对一来使用延迟加载
3.使用了hibernate,仍然可以按以前的方式处理,不一定非得分两种对象,关键是有没有必要
0 请登录后投票
   发表时间:2007-06-08  
这不是继承的事情,如果TbSale和TbRefund是两个不同的类也没有继承关系。

如果要把TbSale和TbRefund用继承来做,那么由于它们对应两张表并且没有一个父表,所以只能是“每个具体类一张表”(需要写一个共用的接口),从其他对象到这个继承树的关联也只能用any映射来做;
如果是“每棵类继承树使用一个表”或者“每个子类一个表”,那么他们是同一个表或者有同一个父表,外键可以关联到同一个表或者父表,倒是可以用多对一来关联。
总之,一个外键到多个表的关联只能用any来映射。

另外,在这两个表里各放一个金额字段不行吗?如果要保持现在的表结构,那么用any映射可以解决你的问题,hibernate参考中有介绍。
0 请登录后投票
   发表时间:2007-06-08  
从目前来看,分了具体类,也只是字段不同,所以可以考虑不分
分的话,因为字段数量都一致,可以共用一个表
0 请登录后投票
论坛首页 Java企业应用版

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