医生和星际战甲零号病患攻略是一对多还是多对一,还是多对多

Grails GORM中的映射(一对一 一对多 多对多) - just memory - ITeye技术网站
博客分类:
本文来自:fair- 转截请注明出处
配合手册里的例子 做了些小试验
这篇博文是里面6.1~6.2的内容 官方的指南写得很详细很好啊...
Grails的ORM的底层实现还是用的hibernate(在现在最新的2.3.3中是hibernate3)
grails create-domain-class helloworld.Person
class Person {
String name
Integer age
Date lastVisit
} //id是自动生成的 所以不用自己创建(当然自己设定个 Integer id 是完全没问题的)
基本的CRUD操作:
def p = new Person(name: "Fred", age: 40, lastVisit: new Date())
def p=Person.get(1) //1是id
assert 1==p.id
用只读方式读取
def p=Person.read(1)
用代理(proxy)方式读取(这和hibernate中的load是一样的):
def p = Person.load(1)
U的操作就是先读再存:
def p = Person.get(1)
p.name = "Bob"
def p = Person.get(1)
p.delete()
6.2中是关于一对一 一对多 多对多的内容:
多对一和一对一关系:
class Face {
class Nose {
static belongsTo = [face:Face]
这样在数据库中建立的表是:
可见外键是由face维护的
保存的话通过:
new Face(nose:new Nose()).save()
因为belongsTo是将控制权给对方 所以
new Nose(face:new Face()).save() // will cause an error
是错误的 face还是瞬时态的 不能被保存
删除Face的话对应的Nose也会被删除
def f = Face.get(1)
f.delete() // both Face and Nose deleted
但如果让一个Nose被多于一个的Face关联
那么删除任意一个Face会抛出异常的(那个Nose还被其他的Face关联)
所以这样的做法不是真正的一对一 而是nose对face的一个一对多关系 为了保险 限制一下nose的唯一
static constraints={
nose(unique:true)
Face对Nose是级联的保存 更新和删除
真正的一对一:
class Face {
static hasOne = [nose:Nose]
class Nose {
这样的话 外键字段是在nose中的face_id中
在Nose中是不能级联保存Face的
有了hasOne就不能单独保存任何一方了
在试验中 不设置Face的Nose属性 不设置Nose的Face属性都不能被正常的save
删除face nose也会被级联删除
不过单独删除Nose是没问题的
Nose.withTransaction{
Nose.get(2).delete() //删除一个Nose
是可行的 从face中查询也只是得到null而已
自引用的例子:
如果有多个相同类型的属性在里面 并且这些属性都是自引用的(引用自身表)
那么grails的映射关系就需要人为指定一下:
class Person {
String name
Person parent
static belongsTo = [ supervisor: Person ]
static constraints = { supervisor nullable: true }
他会把parent和supervisor当作是同一个联系的两个不同的方向
如果你在A1上设置了parent A2 那么会在A2上设置supervisor为A1
我把这个问题详细说一下 按以上代码输入后:
执行下列代码:
import orm_test.*
Person.withTransaction{
new Person(name:"cc",parent:new Person(name:"fairjm")).save()
同一个关系的不同方向 就如上图所示
用mappedBy可以解决:
class Person {
String name
Person parent
static belongsTo = [ supervisor: Person ]
static mappedBy = [ supervisor: "none", parent: "none" ]
static constraints = { supervisor nullable: true }
mappedBy是指导如何映射的 这样的"none"是表示不映射对方类(也就是Person啦)的任意一个属性
(最开始 grails会将Parent映射到对方的supervisor的
也就是类似:
static mappedBy = [ supervisor: "parent", parent: "supervisor" ]
关于一个类中有多个相同类型的属性的映射问题都要通过mappedBy来手工指定映射关系解决掉
class Author {
static hasMany = [books: Book]
String name
class Book {
String title
这是一个单向的一对多 grails默认用一张中间表的形式:
def a = Author.get(1)
for (book in a.books) {
println book.title
默认是懒加载的形式
这样做的默认会级联更新和保存 但不会级联删除
import orm_test.*
Author.withTransaction{
/* def au=new Author(name:"cc")
au.books=[new Book(title:"book1"),new Book(title:"book2")]
au.save()*/
Author.get(1).delete() //不会导致book被删除
实现级联删除要用belongsTo 原先的单向关系也会变成一个双向的一对多关系:
class Author {
static hasMany = [books: Book]
String name
class Book {
static belongsTo = [author: Author]
String title
以上设置的话 表的结构会发生变化 不会有中间表了 外键字段被加在了多的一端:
import orm_test.*
Author.withTransaction{
def au=new Author(name:"cc")
au.books=[new Book(title:"book1",author:au),new Book(title:"book2",author:au)]
//这边必须显示指定au了 book那多了一个属性不是~~ 不过没有addToBooks方法 但多对多的时候就会有..
Author.get(7).delete() //会导致book被删除
用mappedBy解决一个类下多个同类型属性的问题:
class Airport {
static hasMany = [outboundFlights: Flight, inboundFlights: Flight]
static mappedBy = [outboundFlights: "departureAirport",
inboundFlights: "destinationAirport"]
class Flight {
Airport departureAirport
Airport destinationAirport
class Book {
static belongsTo = Author
static hasMany = [authors:Author]
String title
class Author {
static hasMany = [books:Book]
String name
多对多生产的中间表:
Author负责关系的维护
(Book是不能向author表插入新Author的 也就是Book不能在addToAuthors的时候用一个瞬时态的对象)
new Author(name:"Stephen King")
.addToBooks(new Book(title:"The Stand"))
.addToBooks(new Book(title:"The Shining"))
这样是可以的
book不会被级联删除..
Author.withTransaction{
def p=new Author(name:"cc")
p.addToBooks(new Book(title:"book1")).addToBooks(new Book(title:"book2")).save() //可以级联保存book
Book.list()
Author.withTransaction{ //用户删除的话 中间表的条目会被删除 但是book不会被删除
for( def a:Author.list())
a.delete(); //删除所有用户
Book.list() //还存在
import orm_test.*
Author.withTransaction{
def p=new Author(name:"cc")
p.addToBooks(new Book(title:"book1")).addToBooks(new Book(title:"book2")).save()
Author.withTransaction{
def p=new Author(name:"cc2") //新增一个用户cc2
Book.withTransaction{
Book.findByTitle("book1").addToAuthors(Author.findByName("cc2")).save() //中间表更新了状态
查询也是没有问题的:
import orm_test.*
Book.withTransaction{
def b=Book.findByTitle("book1")
b.authors?.toString()
文档里还说 多对多关系现在的脚手架还不支持
以后的内容有空再更新了~~
浏览: 117321 次
来自: 杭州
要在已连接的情况下彻底断开连接,可以先用disconnect_ ...
fair_jm 写道lishankang 写道楼主没有遇到这个 ...
lishankang 写道楼主没有遇到这个问题吗?Except ...
楼主没有遇到这个问题吗?Exception in thread ...
下面的这个文章里面的例子写的很清楚,推荐看看http://bl ...求大神指教hibernate,一对多,多对一的作用
[问题点数:20分,结帖人hanhan12312]
求大神指教hibernate,一对多,多对一的作用
[问题点数:20分,结帖人hanhan12312]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。提问回答都赚钱
> 问题详情
下列叙述中,正确的是A.用ER图能够表示实体集间一对一的联系、一对多的联系和多对多的联系B.用ER
悬赏:0&&答案豆&&&&提问人:匿名网友&&&&提问收益:0.00答案豆&&&&&&
下列叙述中,正确的是A.用E-R图能够表示实体集间一对一的联系、一对多的联系和多对多的联系B.用E-R图只能表示实体集之间一对一的联系C.用E-R图只能表示实体集之间一对多的联系D.用E-R图表示的概念数据模型只能转换为关系数据模型请帮忙给出正确答案和分析,谢谢!
发布时间:&&截止时间:
网友回答&(共0条)
回答悬赏问题预计能赚取&2.00元收益
回答悬赏问题预计能赚取&3.00元收益
回答悬赏问题预计能赚取&91.00元收益
回答悬赏问题预计能赚取&3.00元收益
回答悬赏问题预计能赚取&91.00元收益
回答悬赏问题预计能赚取&4.00元收益
回答悬赏问题预计能赚取&1.00元收益
回答悬赏问题预计能赚取&1.00元收益
回答悬赏问题预计能赚取&3.00元收益
回答悬赏问题预计能赚取&1.00元收益
回答悬赏问题预计能赚取&1.00元收益
回答悬赏问题预计能赚取&4.00元收益
回答悬赏问题预计能赚取&3.00元收益
回答悬赏问题预计能赚取&3.00元收益
回答悬赏问题预计能赚取&1.00元收益
回答悬赏问题预计能赚取&3.00元收益
回答悬赏问题预计能赚取&91.00元收益
回答悬赏问题预计能赚取&3.00元收益
回答悬赏问题预计能赚取&3.00元收益
回答悬赏问题预计能赚取&51.00元收益
回答悬赏问题预计能赚取&51.00元收益
回答悬赏问题预计能赚取&3.00元收益
回答悬赏问题预计能赚取&3.00元收益
回答悬赏问题预计能赚取&3.00元收益
回答悬赏问题预计能赚取&1.00元收益
回答悬赏问题预计能赚取&1.00元收益
回答悬赏问题预计能赚取&1.00元收益
回答悬赏问题预计能赚取&3.00元收益
回答悬赏问题预计能赚取&22.00元收益
回答悬赏问题预计能赚取&22.00元收益
回答悬赏问题预计能赚取&2.00元收益
回答悬赏问题预计能赚取&1.00元收益
回答悬赏问题预计能赚取&1.00元收益
回答悬赏问题预计能赚取&3.00元收益
回答悬赏问题预计能赚取&1.00元收益
回答悬赏问题预计能赚取&1.00元收益
回答悬赏问题预计能赚取&3.00元收益
回答悬赏问题预计能赚取&1.00元收益
回答悬赏问题预计能赚取&3.00元收益
回答悬赏问题预计能赚取&3.00元收益
回答悬赏问题预计能赚取&1.00元收益
回答悬赏问题预计能赚取&3.00元收益
回答悬赏问题预计能赚取&1.00元收益
回答悬赏问题预计能赚取&1.00元收益
回答悬赏问题预计能赚取&1.00元收益
你可能喜欢的
[] [] [] [] [] [] [] [] [] [] [] []
请先输入下方的验证码查看最佳答案
图形验证:}

我要回帖

更多关于 医生和病患 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信