ความแตกต่างระหว่างการประกาศ belonsTo 2 แบบนี้

43 views
Skip to first unread message

iporsut

unread,
Jan 21, 2011, 10:23:25 AM1/21/11
to กลุ่มผู้ใช้เกรลส์ในไทย
ผมลองทำตามตัวอย่างเรื่อง Many to one / one to one ใน document ของ gorm
ตามลิ้งนี้ครับ
http://grails.org/doc/latest/guide/5.%20Object%20Relational%20Mapping%20%28GORM%29.html#5.2.1.1%20Many-to-one%20and%20one-to-one
ซึ่งมี 2 domains คือ Face กับ Nose แล้วตรงที่ทำ many to one ที่กำหนด
belongsTo ใน Nose แบบนี้

class Nose {
static belongsTo = [face:Face]
}

ผมทดสอบใน console แบบนี้

new learn_gorm.Face(nose:new learn_gorm.Nose()).save()
new learn_gorm.Face(nose:learn_gorm.Nose.get(1)).save()

คือให้ 2 faces มี nose ตัวเดียวกันตอนเซฟ เซฟได้ แต่ว่าพอเรียก nose
ออกมาอีกครั้งจะเกิด exception ตัวนี้ขึ้นมา

"More than one row with the given identifier was found"

แต่ถ้าเกิดเปลี่ยนตรง belongsTo เป็น

static belongsTo = Face

จะสามารถเรียก learn_gorm.Nose.get(1) ออกมาได้ปกติ หลังจากเซฟ face
ทั้งสองตัวแบบโค้ดด้านบนแล้ว

มันต่างกันยังไงเหรอครับการใช้ belongsTo ทั้งสองแบบนี้
ทำไมถึงให้งานแบบโค้ดข้างบนแล้วให้ผลลัพธ์ต่างกัน

Chanwit Kaewkasi

unread,
Jan 21, 2011, 9:35:18 PM1/21/11
to thai-gra...@googlegroups.com
ทดลองดูแล้วบน Grails 1.3.6 ให้ผลลัพธ์เหมือนกันครับ

กรณี static belongsTo = [face:Face]

groovy:000> new belong.Face(nose:new belong.Nose()).save()
===> belong.Face : 1
groovy:000> belong.Face.get(1).nose
===> belong.Nose : 1
groovy:000> new belong.Face(nose:belong.Nose.get(1)).save()
===> belong.Face : 2
groovy:000> belong.Face.get(2).nose
===> belong.Nose : 1

กรณี static belongsTo = Face

groovy:000> new belong.Face(nose:new belong.Nose()).save()
===> belong.Face : 1
groovy:000> new belong.Face(nose:belong.Nose.get(1)).save()
===> belong.Face : 2
groovy:000> belong.Face.get(1).nose
===> belong.Nose : 1
groovy:000> belong.Face.get(2).nose
===> belong.Nose : 1

อย่างไรก็ตาม วิธีการ assign แบบนี้จะเกิดปัญหาครับเพราะมี cascade
delete จาก belongsTo อยู่
เราไม่ควรใช้ object ตัวเดียวกันไป belongsTo 2 object ที่ต่างกันครับ
เพราะถ้าลบ Face: 1 เมื่อไหร่แล้ว Nose: 1 จะหายไปด้วย
ทำให้ Face: 2 ที่ใช้ Nose: 1 อยู่เกิดความผิดปกติ (ต้องลบ nose ออกจาก
Face: 2 เอง)

-ชาญวิทย์

2011/1/21 iporsut <sin...@gmail.com>:

--
Dr Chanwit Kaewkasi, Lecturer
School of Computer Engineering,
Suranaree University of Technology
Nakhon Ratchasima, Thailand 30000

iporsut

unread,
Jan 22, 2011, 8:18:37 AM1/22/11
to กลุ่มผู้ใช้เกรลส์ในไทย
ผมทดลองใหม่กับ grails shell ไม่มีปัญหาเหมือนกันครับ
ที่เกิด exception แบบนั้นเป็นตอนผมใช้ grails console ทดสอบนะครับ

> 2011/1/21 iporsut <sing...@gmail.com>:


>
>
>
> > ผมลองทำตามตัวอย่างเรื่อง Many to one / one to one ใน document ของ gorm
> > ตามลิ้งนี้ครับ

> >http://grails.org/doc/latest/guide/5.%20Object%20Relational%20Mapping...

Chanwit Kaewkasi

unread,
Jan 22, 2011, 8:27:06 AM1/22/11
to thai-gra...@googlegroups.com
อาจจะเป็นเพราะการรัน script ซ้ำ สร้าง object
ซ้ำกันบางอย่างเลยอาจจะทำให้เกิดปัญหานี้ครับ
เพราะ grails console จะโหลด script เข้าไปทำใหม่ทั้งก้อน แต่ grails
shell ทำแบบ interactive ทีละบรรทัด

-ชาญวิทย์

2011/1/22 iporsut <sin...@gmail.com>:

polawat phetra

unread,
Jan 22, 2011, 9:38:11 AM1/22/11
to thai-gra...@googlegroups.com
exception นี้เป็นของ hibernate ที่คาดหวังว่า row return มากกว่า 1 
ก็เลยเปิด loggingSql ดู

ก็เลยเจอแบบนี้
เริ่มด้วย data

2011-01-22_2125.png

ลองเรียก Nose ขึ้นมาดู
2011-01-22_2126.png

แต่ถ้าเปลี่ยน belongsTo เป็นแบบป้อว่า

 2011-01-22_2132.png



ป๊อก

2011/1/22 Chanwit Kaewkasi <cha...@gmail.com>
2011-01-22_2125.png
2011-01-22_2132.png
2011-01-22_2126.png

Chanwit Kaewkasi

unread,
Jan 22, 2011, 9:44:30 AM1/22/11
to thai-gra...@googlegroups.com
แสดงว่า step การ reproduce ของผมผิด
คือต้องสร้าง Face 2 ตัว ชี้ไปหา Nose ตัวเดียวกันก่อน
แล้วค่อย fetch Nose ที่ถูก share กันออกมา ถึงจะเกิด exception นี้

-ชาญวิทย์

2011/1/22 polawat phetra <pph...@gmail.com>
2011-01-22_2132.png
2011-01-22_2126.png
2011-01-22_2125.png

iporsut

unread,
Jan 22, 2011, 10:25:54 AM1/22/11
to กลุ่มผู้ใช้เกรลส์ในไทย
อ่อเป็นเช่นนี้นี่เอง ขอบคุณพี่ป๊อก กับ พี่ใหม่ครับ ที่ให้ความกระจ่าง

On Jan 22, 9:38 pm, polawat phetra <pphe...@gmail.com> wrote:
> exception นี้เป็นของ hibernate ที่คาดหวังว่า row return มากกว่า 1
> ก็เลยเปิด loggingSql ดู
>
> ก็เลยเจอแบบนี้
> เริ่มด้วย data
>
> [image: 2011-01-22_2125.png]
>
> ลองเรียก Nose ขึ้นมาดู
> [image: 2011-01-22_2126.png]
>
> แต่ถ้าเปลี่ยน belongsTo เป็นแบบป้อว่า
>
>  [image: 2011-01-22_2132.png]
>
> ป๊อก
>

> 2011/1/22 Chanwit Kaewkasi <chan...@gmail.com>


>
> > อาจจะเป็นเพราะการรัน script ซ้ำ สร้าง object
> > ซ้ำกันบางอย่างเลยอาจจะทำให้เกิดปัญหานี้ครับ
> > เพราะ grails console จะโหลด script เข้าไปทำใหม่ทั้งก้อน แต่ grails
> > shell ทำแบบ interactive ทีละบรรทัด
>
> > -ชาญวิทย์
>

> > 2011/1/22 iporsut <sing...@gmail.com>:

>  2011-01-22_2125.png
> 49KViewDownload
>
>  2011-01-22_2132.png
> 52KViewDownload
>
>  2011-01-22_2126.png
> 174KViewDownload

Reply all
Reply to author
Forward
0 new messages