Many-to-many relationship mapping with GORM/Grails
来源:互联网 发布:linux支持的处理器 编辑:程序博客网 时间:2024/05/28 18:44
I’ve been working on a pet project in my spare time – a sort of twitter clone that authenticates against Atlassian Crowd. I’m using the awesome Grails/Crowd plugin, which is pretty seamless (but needs a bit of internal polishing).
I’ve only scratched the surface of Grails, but here are a few things I’ve run into as a Grails newb.
Many-to-many relationships and cascading updates
GORM (Grails’s abstraction of Hibernate) lets you define a many-to-many relationship like this:
class User { String name static hasMany = [groups: Group]} class Group { String name static hasMany = [members : User] static belongsTo = User }
This relationship can be accessed through some helpful dynamic methods that Grails provides:
new User(name: "foo").addToGroups(name: "bar").save()// creates a new user AND group, saves both of them // and the relationship def user = new User(name: "foo").save()new Group(name: "bar").save().addToMembers(user)// as above, but addToMembers will not cascade the relationship // to the user
The crucial part here is the belongsTo
property of the domain classes. This tells GORM which class should “own” the relationship. What this means is that if you want the relationship to cascade through both objects, you will need to call the addTo*
method on the owning object.
Many-to-many relationships with the same class
Back to the pet project – one of the features I really wanted was the ability to subscribe to status updates for a whole group.
Here’s a quick ERD (generated by the excellent IDEA/Grails integration) of the domain classes:
You can quickly see that there are two many-to-many relationships between the classes User
and Group
.
The code looks something like this now (other stuff stripped out):
class User { String name static hasMany = [groups: Group, groupSubscriptions: Group] static mappedBy = [groups: "members"]} class Group { String name static hasMany = [members : User] static belongsTo = User static mapping = { // we can't have a table called group table "group_" }}
I thought that Grails would be smart enough to see what I was doing, but I was wrong (for various reasons). To cut to the chase, here’s the necessary code to implement this:
class User { String name static hasMany = [groups: Group, groupSubscriptions: Group] static mappedBy = [groups: "members", groupSubscriptions: "subscribers"] static mapping = { groupSubscriptions joinTable: "user_group_s" }} class Group { String name static hasMany = [members : User, subscribers: User] static belongsTo = User static mapping = { // we can't have a table called group table "group_" subscribers joinTable: "user_group_s" }}
Grails will create two relationship tables user_group_
anduser_group_s
. Having the back reference from Group
to User
isn’t so bad, since the collection is lazy loaded. I would have just preferred not to pollute the domain class.
Conclusion
I hope that someone out there finds this information useful, I’d hate to see another Grails newb fall into this big dark pit that I call lack of documentation.
That said, my experience with Grails and Groovy so far has been pretty awesome. If you’re looking to develop a web-app rapidly, I’d definitely be looking at Grails as an option.
- Many-to-many relationship mapping with GORM/Grails
- NHibernate Cookbook 3 Mapping a one-to-many relationship
- Grails one-to-many 排序
- 20150708 MyEclipse Hibernate Many To Many Mapping
- Hibernate Mapping 3 : Many To Many
- Dynamics CRM Entity Relationship Many to Many (N:N)
- Many to Many relation with Entity Framework
- Hibernate – Many-to-Many example (XML Mapping)
- Hibernate – Many-to-Many example (XML Mapping)
- Hibernate Mapping 2 : One to Many
- many-to-many性能
- hibernate-----many-to-many
- Hibernate many to many
- hibernate many-to-many
- many to many
- Many-to-many Query
- Many-to-Many
- many-to-many
- Xcode及模拟器SDK下载
- java基础-面向对象、类与对象的定义
- Android游戏开发第三天(1)
- swift在storyboard中如何实现代理委托指向(简单代码)
- SysLog简介和java操作实例
- Many-to-many relationship mapping with GORM/Grails
- Visio画UML用例图没有include关系的解决方法
- Android 中查询数据库时Cursor类的使用
- hash_set哈希集合容器
- win7旗舰版(64位)环境下oracle11g的安装方法
- 配置Linux系统(修改/proc)
- 有源汇点有上下界的最小流
- hdu 4549 M斐波那契数列(矩阵快速幂,快速幂降幂)
- jquery实现按回车提交数据