N:N的实体关系,可以把关系变成 转化为 一个实体, 这样N:N的关系就弱化成了 老实体 N:1 关系实体 1:N 老实体
在数据库中,用三个表表示 m:m 关系:前两个表您已经知道了(Book
和 Author
),第三个是一个连接表(BookAuthor
)。GORM 向 BookAuthor
连接表添加 book_id
和 author_id
,而不是向 Book
或 Author
表添加一个外键。连接表允许将具有一个作者的图书和具有多个作者的图书持久化。它还能够表示编写多部图书的作者。Author
和 Book
外键的每种惟一组合都会在连接表中有惟一的记录。这种方法具有极大的灵活性:一本书可以有任意数量的作者,而一个作者可以编写任意数目的图书。
Dierk Koenig 曾经告诉我,“如果您认为只有两个对象共享一个简单的多对多关系,那么您对多对多关系的了解还不够透彻。还存在第三个对象,这个对象有其自己的属性和生命周期”。确实如此,Book
和 Author
之间的关系已经超出了简单连接表的范围。例如,Dierk 是 Groovy in Action(Manning Publications,2007 年 1 月)的第一作者。第一作者的身份应该表示为 Author
与 Book
之间的关系中的一个字段。其他各种因素也应如此:作者会按特定顺序在封面上列出;每个作者编写图书的特定章节;而且每个作者的报酬也因贡献不同而异。您可以看到,Author
与 Book
之间的关系比最初计划的更加微妙。在真实世界中,每个作者都会签订一份合同,使用明确的条款详细描述他与这部图书之间的关系。或许应该创建一个一级类 Contract
来更好地表示 Book
与 Author
之间的关系。
取名字永远是头痛的东西, 锦囊中就遇到了如下问题, ad和position 形成的关系表 , 有了很多自己的属性(hibernate embedded ) , hibernate对关系查询并不是很好;;
这个时候就需要有一个专门的实体来替代这个关系 embedded 类; 已有的<Position, PositionInfo> getPositionInfoMap
简单来讲,这意味着一个 m:m 关系实际上就是两个 1:m 关系。如果两个类有可能共享一个 m:m 关系,那么您应该更深入地研究一下,确定出具有两个 1:m 关系的第三个类并显式地定义它。
http://www.ibm.com/developerworks/cn/java/j-grails04158/