[SEAM] 请教一个好象有点麻烦的问题

bigcatJavaEye 2008-03-07
现在项目中有这样一个不太规范的表
如下:再同一张表里面车库和汽车的信息,1对n关系。
      table:
      ----------------------------------------------------------
      storeId  storeName  storeAddr  carId  carType   carColour
      001       东库        大连      001     ABC       red
      001       东库        大连      002     TRE       red
      001       东库        大连      003     ATT       red
      ----------------------------------------------------------
      key1:storeId
      key2:carId

现在要求表里面对应出两个model, store(key:storeId)和car(key:carId).这两个model是1对n的关系。做store来mapping. store有个carList属性。
会出现下面两个问题:
1 如果只修改storeId为001的storeName,就是要求ORM找到所有storeId为001的纪录,把他们的storeName全部改掉。hibenate有没有一次处理多条数据的功能?001的纪录有多条的话它直接报错。
2 即使我做出来了一个对象,store带个carList,怎么保存?因为保存的时候,DB生成的纪录数目应该是carList的长度。hibenate有没有这功能?
  
不知道各位有没有碰到类似情况。(说明有不清楚的地方请提出)
pf_miles 2008-03-07
这个表还没到三范式,可能为了争取性能,牺牲了空间。不知道你们目前的应用大不大,够大的话这样所有字段都放一个表里很快会成为瓶颈。
从业务的角度讲,“第一种方案”我觉得是没有道理的,不知道你怎么考虑它。既然要用seam,图的就是OO,快速,以及中间(业务)管两边(view和数据)。我觉得一个store对应多个car是比较好理解的。开发维护会更顺手。
不知道你提出“第一种方案”的理由是什么?
bigcatJavaEye 2008-03-07
pf_miles 写道
这个表还没到三范式,可能为了争取性能,牺牲了空间。不知道你们目前的应用大不大,够大的话这样所有字段都放一个表里很快会成为瓶颈。
从业务的角度讲,“第一种方案”我觉得是没有道理的,不知道你怎么考虑它。既然要用seam,图的就是OO,快速,以及中间(业务)管两边(view和数据)。我觉得一个store对应多个car是比较好理解的。开发维护会更顺手。
不知道你提出“第一种方案”的理由是什么?

第一种方案其实就是凑下面帖子的例子的,起码可以实现两个model。
http://topquan.iteye.com/blog/67490
第二种方案想不出来怎么实现。
store组件在插入的时候,它怎么知道根据自己属性carList的数量把自己变成多个的。
感觉不太符合 “组件instance对应table的record”这个原则。
pf_miles 2008-03-07
bigcatJavaEye 写道
pf_miles 写道
这个表还没到三范式,可能为了争取性能,牺牲了空间。不知道你们目前的应用大不大,够大的话这样所有字段都放一个表里很快会成为瓶颈。
从业务的角度讲,“第一种方案”我觉得是没有道理的,不知道你怎么考虑它。既然要用seam,图的就是OO,快速,以及中间(业务)管两边(view和数据)。我觉得一个store对应多个car是比较好理解的。开发维护会更顺手。
不知道你提出“第一种方案”的理由是什么?

第一种方案其实就是凑下面帖子的例子的,起码可以实现两个model。
http://topquan.iteye.com/blog/67490
第二种方案想不出来怎么实现。
store组件在插入的时候,它怎么知道根据自己属性carList的数量把自己变成多个的。
感觉不太符合 “组件instance对应table的record”这个原则。

有意思...“组件instance对应table的record”是什么原则?组件实例的数据确实来源于一个或多个数据库表的record,但不是你说的那种一个萝卜一个坑的对应关系,是有差异的,这种差异来源于OO模型和E-R关系模型的差异,所以才需要O-R mapping。

“store组件在插入的时候,它怎么知道根据自己属性carList的数量把自己变成多个的。”

不知道你是否试图在seam中整合ibatis,否则这个问题是不需要考虑的:如果你用EJB3.0作persistence,那么OneToMany和ManyToOne结合Table,Column  annotation会为你解决这个问题;如果你用Hibernate,那么你也只需要在映射文件里把这个对应关系描述清楚就行了,你不必关心“它怎么知道根据自己属性carList的数量把自己变成多个的”。
就算你真的用ibatis,也很好想吧——对于这个store对象中的每一个car对象,都携带一个storeId插入数据库,最后update 你的表 set (......) where storeId=#这个storeId#
pf_miles 2008-03-07
另外,只要你打算OO,那么不管怎么设计,都应该有2个model:store和car,如果没有,那么就不算OO。
bigcatJavaEye 2008-03-07
pf_miles 写道
另外,只要你打算OO,那么不管怎么设计,都应该有2个model:store和car,如果没有,那么就不算OO。

to:pf_miles
谢谢你的回复.
我实现一下看看.
bigcatJavaEye 2008-03-07
不好意思呀,还是没整出来。
能不能实现一下瞅瞅。可能用代码更好讲解一些。
谢谢先。
pf_miles 2008-03-07
bigcatJavaEye 写道
不好意思呀,还是没整出来。
能不能实现一下瞅瞅。可能用代码更好讲解一些。
谢谢先。

正好我也正学习这个框架,可以做一个例子给你看,不是很难,但我想我不得不先解决这个问题:http://seam.group.iteye.com/group/topic/4419
pf_miles 2008-03-09
例子已经做好了,我抽空发到我的blog上吧~好久没写文章了。
xxqn 2008-03-09
我的项目中放弃使用表格深度继承,继承关系手动实现更加能够保证性能。如果遇到你这种情况,建两个表就成了,
store表
storeId  storeName  storeAddr 

car表
storeId carId  carType   carColour
如果你的数据不是太多可以使用OneToMany和ManyToOne,这样关系更加清晰
Global site tag (gtag.js) - Google Analytics