问题描述
在hibernate中,如果要映射多对多的映射比如有两个实体:user, privilege,数据库中通过link表来表示两者的关联关系,单在link中有一个flag标识是否有效,这样怎样在hibernate中解决?拆成两个一对多?还有没有其他方法?问题补充:我的意思是link中除了那三个字段之外,我还有一个字段表示这个关系是否生效,也就是说,这个字段是重点,在业务中要靠这个字段来确定映射关系是否有效。谢谢问题补充:formular我试过可是如果我的需求是动态的,怎么办?其实这才是我的真正问题。我的意识是flag有很多种值,我需要根据业务选择不同的值,用where只能产生死的值。问题补充:比如说:User和Role之间的多对多关系,中间表USER_ROLE中不仅有user_id和role_id,还有两个子段,标识有效期。有一个是begin_date,一个是end_date。具体到业务上:一个是查询某个user现在所拥有的role,另外一个是:曾经拥有的role。问题补充:感谢回答。
解决方案
如果这样的话,可以改成<one-to-many>的写法,生成一个中间UserRole类。或者可以试试<composite-element><set name="items" lazy="true" table="CATEGORY_ITEMS"><key column="CATEGORY_ID"/><composite-element class="CategorizedItem"><parent name="category"/><many-to-one name="item"class="Item"column="ITEM_ID"not-null="true"/><property name="username" column="USERNAME" not-null="true"/><property name="dateAdded" column="DATE_ADDED" not-null="true"/></composite-element></set>从<Hibernate in Action> 229页转载,如有需要,通知我一声
解决方案二:
引用我的意识是flag有很多种值,我需要根据业务选择不同的值,用where只能产生死的值。 能取个具体的例子吗?是用在什么样的逻辑上呢?
解决方案三:
你可以试一下:<class name="User" table="User"> <id...>...</id> <set name="privileges" table="link" lazy="false" where="flag='available'"> <key column="userid"/> <many-to-many class="Privilege" column="privilegeid" lazy="false"/> </set> </class> 或者formula这个标签。希望对你有帮助!
解决方案四:
link中有三个字段:id,userid,privilegeidUser.hbm:<class name="User" table="User"> <id...>...</id> <set name="privileges" table="link" lazy="false"> <key column="userid"/> <many-to-many class="Privilege" column="privilegeid" lazy="false"/> </set></class>Privilegeid配置也一样