hibernate多对多关系问题

比如现在我有一个需求:我有2个实体User和Message(多对多关系)1个User可以有多条Message,1条Message可以发送给多个User现在我有一个属性bo... 比如现在我有一个需求:
我有2个实体 User和Message(多对多关系)
1个User可以有多条Message,1条Message可以发送给多个User
现在我有一个属性boolean isReaded,这个属性是标记User已读过的Message
问题:这个属性应该在Message实体里吗?
应该怎么配置xml呢,数据库里 应该是把这个属性字段写在关联表里吗?
展开
 我来答
玩者无敌
2011-08-26 · TA获得超过1812个赞
知道小有建树答主
回答量:306
采纳率:0%
帮助的人:443万
展开全部
这种情况不能直接用ManyToMany多对多。
ManyToMany只适合于两者只有基本的外键对应关系,也就是两者的中间关系表没有额外的有效数据。
你这个有额外的isReaded数据。

这个字段应该要放到User和Message的中间关系表中去。
如果放到Message里,那么一条Message可以发给多个User,如果有些User读了,有些User没读,那Message中这个isReaded标志就没法设置了。
所以必须放到关系表中,但这样就不能直接用多对多了,因为关系表中这个字段就没法映射了。

这种情况要把ManyToMany,拆成两组ManyToOne。
由于中间关系表也有有效数据,所以它也要映射成一个PO类,比如映射为UserMsg类;那么一个User就对应多个UserMsg,所以User与它是OneToMany;
同样,一个Message也对应多个UserMsg,所以Message与它也是OneToMany;
你在User和Message中分别都映射一个OneToMany的UserMsg,并在UserMsg中把User和Message都映射为ManyToOne,isReaded字段在UserMsg中。
这样,就把多对多拆成两组一对多了。
汉卿来子墨
2011-08-27
知道答主
回答量:11
采纳率:100%
帮助的人:6302
展开全部
messages table structure users table structure
_____________________________ ________________________
mid message_content uid uname ……
_____________________________ ________________________
m1 message1 u1 user1
_____________________________ ________________________
m2 message2 u2 user2
user&message relational table structure
_____________________________
uid mid status
_____________________________
u1 m1 1 (waiting read)
_____________________________
u1 m2 2 (read)
_____________________________
u2 m1 3 (waiting sent)
_____________________________
u2 m2 4 (sent)
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
tuoxingzhou
2011-08-26 · TA获得超过191个赞
知道答主
回答量:93
采纳率:0%
帮助的人:38万
展开全部
直接放在message类就好了
标示此信息是否已读
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2011-08-26
展开全部
顶 六级那个回答!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
风OOO吹
2011-08-26
知道答主
回答量:20
采纳率:0%
帮助的人:11.5万
展开全部
也顶六级的那个回答
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
实浪香8860
2011-08-27 · TA获得超过159个赞
知道答主
回答量:484
采纳率:0%
帮助的人:291万
展开全部
在多对多关系中,中间关系表中的数据本身就是靠role和popedom来进行控制的。
当添加role或popedom时,会自动根据多对多的set集合中的数据在对中间关系表的数据进行添加。
删除时也一样,根据Set集合中的数据来对中间关系表进行删除。
而当进行更新操作时,hibernate会自动先将中间关系表中的数据删除,再将现在Set集合中的数据添加到中间表中,以完成修改的目的。(先删除原有数据,再添加新的数据)

如果不想这样自动修改,可以直接使用HQL进行修改,而不使用session.update()方法,这样可以防止这种关系表的级联操作。也可以通过配置inverse="true"来完成。

关系表中的数据只能通过这种关联的方式来更新。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式