最近在学校工作室做项目时碰到一个Hibernate复合主键的问题,也就是多对多映射的时候中间表不使用代理主键的话会用到复合主键,如果使用代理主键的话,那么中间表的外键肯定是many-to-one的,这样的话跟业务要求不合(即两端的主键合成的中间表外键必须是唯一的,而这样能做到不唯一)。物理模型见附件。
大概描述:
收邮件
用户表-n----m-用户_邮件表-p----n-邮件表
发邮件
用户表-n-----1-邮件表
中间表的映射:
<composite-id name="id" class="cn.magicoa.skstudio.domain.UserMailId" > <key-many-to-one name="mailChit" class="cn.magicoa.skstudio.domain.MailChit"> <column name="MailId" /> </key-many-to-one> <key-many-to-one name="oaUser" class="cn.magicoa.skstudio.domain.OaUser" lazy="false"> <column name="Uid" /> </key-many-to-one> </composite-id>
private MailChit mailChit;
private OaUser oaUser;
这样的话发邮件的用户获取该邮件的接收者列表将非常吃力,默认的这个复合主键的lazy=true,而如果改为false的话效率会非常底,因为如果用户要获取发邮件列表的话不需要收邮件人列表,所以只能在hql查询中使用fetch抓取的方式。请问大家有没有其他的解决方案。
中间表POJO类UserMail:
private UserMailId id;
private Short type;
private Short isNew;
这样的话需要生成一个UserMailId复合主键POJO类: