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呢,数据库里 应该是把这个属性字段写在关联表里吗? 展开
我有2个实体 User和Message(多对多关系)
1个User可以有多条Message,1条Message可以发送给多个User
现在我有一个属性boolean isReaded,这个属性是标记User已读过的Message
问题:这个属性应该在Message实体里吗?
应该怎么配置xml呢,数据库里 应该是把这个属性字段写在关联表里吗? 展开
展开全部
这种情况不能直接用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中。
这样,就把多对多拆成两组一对多了。
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中。
这样,就把多对多拆成两组一对多了。
展开全部
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)
_____________________________ ________________________
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)
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
直接放在message类就好了
标示此信息是否已读
标示此信息是否已读
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2011-08-26
展开全部
顶 六级那个回答!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
在多对多关系中,中间关系表中的数据本身就是靠role和popedom来进行控制的。
当添加role或popedom时,会自动根据多对多的set集合中的数据在对中间关系表的数据进行添加。
删除时也一样,根据Set集合中的数据来对中间关系表进行删除。
而当进行更新操作时,hibernate会自动先将中间关系表中的数据删除,再将现在Set集合中的数据添加到中间表中,以完成修改的目的。(先删除原有数据,再添加新的数据)
如果不想这样自动修改,可以直接使用HQL进行修改,而不使用session.update()方法,这样可以防止这种关系表的级联操作。也可以通过配置inverse="true"来完成。
关系表中的数据只能通过这种关联的方式来更新。
当添加role或popedom时,会自动根据多对多的set集合中的数据在对中间关系表的数据进行添加。
删除时也一样,根据Set集合中的数据来对中间关系表进行删除。
而当进行更新操作时,hibernate会自动先将中间关系表中的数据删除,再将现在Set集合中的数据添加到中间表中,以完成修改的目的。(先删除原有数据,再添加新的数据)
如果不想这样自动修改,可以直接使用HQL进行修改,而不使用session.update()方法,这样可以防止这种关系表的级联操作。也可以通过配置inverse="true"来完成。
关系表中的数据只能通过这种关联的方式来更新。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询