实体类映射到数据库时,在数据库中生成的表是不一样的.
一个人有多个电话号码 一个电话号码也可以被多个人有
我就张三,李四的手机号,你也有张三,李四的手机号.
再详细些,我有张三的手机号,张三可能有多个手机号,有北京的手机号,有上海的手机号...
一对多这种关系一般要设置一个list/map集合来存,在数据库中体现为外键.
复杂的情况就是多对多关联关系.
楼主的这个情况我这样来分析.
首先是数据库,你想要的那种方式
保存后,数据库里我想要有如下数据:
id| name| phoneNO
1 | li | 123
1 | li | 124
1 | wang| 123
1 | wang| 126
这种方式明显存在着冗余.而且不可能实现,为啥?主键不唯一.
数据库里同时存着id=1的两条记录,那我想要查询id=1的记录怎么查?可以查,但是查出来的是两打记录.但是可以用联合主键id和name,phone三个字段共同确定主键.
但实际情况只有如下数据:
id| name| phoneNO
1 | wang| 126
1 | li | 124
你的的需求是想做什么?
session.saveOrUpdate();这种方式肯定会覆盖前一个,为啥?
你更新了这个类的某个属性phoneNO.
要想实现你想要的情况:
我个人觉得可以这样实现:
建两个实体类,会在数据库中生成两张表.
参照lixieinstein的回答...............
---------------------------------------------------
在Person中
private
//record为联系记录.
再建立映射就行了.//关键要建立好关联关系的映射
当我们加载一个person类时,会加载这个person的属性setRecord
而setRecord是一个集合,我们可以从遍历集合里面取出这些联系记录.
如果某个人的手机号码更改了,你要更新的不是person类,而是更新
联系记录类record类中的某个属性.
我觉得应该这样设计数据库。实际情况下,一个人和他电话号码的就是一对多单向关联映射。电话本只是一个虚拟的概念,不需要实际存在于数据库中,实际存在于数据库中的是电话本中的联系记录。就是一个人对应多个联系记录。这样就行了。
如:person表:
id(主键) username(用户名) truename(真实姓名) ……
联系记录表:
id(主键) personId(外键,和person表中的id对应) name(联系人姓名) number(电话号码)
那么Person中只需要一个Set<联系记录>的属性就行了,然后再把Set中所有的信息根据“联系人姓名-Set<电话号码>”的键值对形式存入到一个Map中,那么这个Map就是你要的Map。
我语言表达比较差,不知道你看懂了没有。电话号码>联系记录>
如果这样的话,那么这又是一个一对多了
map里面嵌套有set了
是复杂了点,如果需求是这样,那也没办法
你为什么不用list去临时存放这些数据呢,而且对于这种id 是可以重复的时候不能用hibernate的saveOrUpdate() saveOrUpdate会根据你的table的主键判断是insert或者是update,在这里你需要的结果都是insert 所以最好还是用 JDBC的 sql写 比较好。
用图来回答你.包括文字方面的解释也在图片上.
圈圈画不圆6244106