2 * @author Graeme Rocher
5 * Created: Sep 27, 2007
7 package org
.codehaus
.groovy
.grails
.orm
.hibernate
9 import javax
.sql
.DataSource
10 import org
.hibernate
.SessionFactory
12 class MappingDslTests
extends AbstractGrailsHibernateTests
{
14 void testTableMapping() {
15 DataSource ds
= (DataSource
)applicationContext
.getBean('dataSource')
19 con
= ds
.getConnection()
20 def statement
= con
.prepareStatement("select * from people")
27 void testColumnNameMappings() {
28 def p
= ga
.getDomainClass("PersonDSL").newInstance()
33 DataSource ds
= (DataSource
)applicationContext
.getBean('dataSource')
37 con
= ds
.getConnection()
38 def statement
= con
.prepareStatement("select First_Name from people")
39 def result
= statement
.executeQuery()
41 def name
= result
.getString('First_Name')
43 assertEquals
"Wilma", name
50 void testDisabledVersion() {
51 def p
= ga
.getDomainClass("PersonDSL").newInstance()
60 void testEnabledVersion() {
61 def p
= ga
.getDomainClass("PersonDSL2").newInstance()
66 assertEquals
0, p
.version
72 assertEquals
1, p
.version
76 void testCustomHiLoIdGenerator() {
77 def p
= ga
.getDomainClass("PersonDSL").newInstance()
83 DataSource ds
= (DataSource
)applicationContext
.getBean('dataSource')
87 con
= ds
.getConnection()
88 def statement
= con
.prepareStatement("select * from hi_value")
89 def result
= statement
.executeQuery()
91 def value
= result
.getLong('next_value')
102 void testLazyinessControl() {
103 def personClass
= ga
.getDomainClass("PersonDSL")
104 def p
= personClass
.newInstance()
105 p
.firstName
= "Wilma"
107 println
"SAVING PERSON"
109 p
.addToChildren(firstName
:"Dino", lastName
:'Dinosaur')
110 p
.addToCousins(firstName
:"Bob", lastName
:'The Builder')
111 println
"SAVING RELATIONS"
115 p
= personClass
.clazz
.get(1)
117 assertTrue p
.children
.wasInitialized()
118 assertFalse p
.cousins
.wasInitialized()
122 void testUserTypes() {
123 DataSource ds
= (DataSource
)applicationContext
.getBean('dataSource')
124 def relativeClass
= ga
.getDomainClass("Relative")
125 def r
= relativeClass
.newInstance()
126 r
.firstName
= "Wilma"
127 r
.lastName
= 'Flintstone'
133 con
= ds
.getConnection()
134 def statement
= con
.prepareStatement("select * from relative")
135 def result
= statement
.executeQuery()
137 def metadata
= result
.getMetaData()
138 assertEquals
"FIRST_NAME",metadata
.getColumnLabel(3)
139 // hsqldb returns -1 for text type, if it wasn't mapped as text it would be 12 so this is an ok test
140 assertEquals( -1, metadata
.getColumnType(3) )
149 void testCompositeIdMapping() {
150 def compositePersonClass
= ga
.getDomainClass("CompositePerson")
151 def cp
= compositePersonClass
.newInstance()
153 cp
.firstName
= "Fred"
154 cp
.lastName
= "Flintstone"
159 cp
= compositePersonClass
.newInstance()
161 cp
.firstName
= "Fred"
162 cp
.lastName
= "Flintstone"
164 def cp1
= compositePersonClass
.clazz
.get(cp
)
167 assertEquals
"Fred", cp1
.firstName
168 assertEquals
"Flintstone", cp1
.lastName
171 void testTablePerSubclassInheritance() {
172 DataSource ds
= (DataSource
)applicationContext
.getBean('dataSource')
176 con
= ds
.getConnection()
177 def statement
= con
.prepareStatement("select * from payment")
179 statement
= con
.prepareStatement("select * from credit_card_payment")
186 def p
= ga
.getDomainClass("Payment").newInstance()
192 def ccp
= ga
.getDomainClass("CreditCardPayment").newInstance()
194 ccp
.cardNumber
= "43438094834380"
200 ccp
= ga
.getDomainClass("CreditCardPayment").clazz
.findByAmount(20)
203 assertEquals
20, ccp
.amount
204 assertEquals
"43438094834380", ccp
.cardNumber
207 void testOneToOneForeignKeyMapping() {
208 def personClass
= ga
.getDomainClass("MappedPerson").clazz
209 def addressClass
= ga
.getDomainClass("MappedAddress").clazz
211 def p
= personClass
.newInstance(name
:"John")
212 p
.address
= addressClass
.newInstance()
218 DataSource ds
= (DataSource
)applicationContext
.getBean('dataSource')
222 con
= ds
.getConnection()
223 def statement
= con
.prepareStatement("select PERSON_ADDRESS_COLUMN from mapped_person")
224 def resultSet
= statement
.executeQuery()
225 assert resultSet
.next()
231 void testManyToOneForeignKeyMapping() {
232 def personClass
= ga
.getDomainClass("MappedPerson").clazz
233 def groupClass
= ga
.getDomainClass("MappedGroup").clazz
235 def g
= groupClass
.newInstance()
237 g
.addToPeople name
:"John"
244 g
= groupClass
.get(1)
247 assertEquals
1, g
.people
.size()
249 DataSource ds
= (DataSource
)applicationContext
.getBean('dataSource')
253 con
= ds
.getConnection()
254 def statement
= con
.prepareStatement("select PERSON_GROUP_COLUMN from mapped_person")
255 def resultSet
= statement
.executeQuery()
256 assert resultSet
.next()
263 void testManyToManyForeignKeyMapping() {
264 def partnerClass
= ga
.getDomainClass("MappedPartner").clazz
265 def groupClass
= ga
.getDomainClass("MappedGroup").clazz
267 def g
= groupClass
.newInstance()
269 g
.addToPartners(partnerClass
.newInstance())
275 g
= groupClass
.get(1)
278 assertEquals
1, g
.partners
.size()
280 DataSource ds
= (DataSource
)applicationContext
.getBean('dataSource')
284 con
= ds
.getConnection()
285 def statement
= con
.prepareStatement("select PARTNER_JOIN_COLUMN,GROUP_JOIN_COLUMN from PARTNER_GROUP_ASSOCIATIONS")
286 def resultSet
= statement
.executeQuery()
287 assert resultSet
.next()
293 void testUnidirectionalOneToManyForeignKeyMapping() {
294 def personClass
= ga
.getDomainClass("MappedPerson").clazz
295 def childClass
= ga
.getDomainClass("MappedChild").clazz
297 def p
= personClass
.newInstance(name
:"John")
299 p
.addToChildren(childClass
.newInstance())
300 p
.addToCousins(childClass
.newInstance())
307 DataSource ds
= (DataSource
)applicationContext
.getBean('dataSource')
311 con
= ds
.getConnection()
312 def statement
= con
.prepareStatement("select PERSON_ID,COUSIN_ID from COUSINS_TABLE")
313 def resultSet
= statement
.executeQuery()
314 assert resultSet
.next()
322 protected void onSetUp() {
328 MappedAddress address
333 static hasMany = [children:MappedChild, cousins:MappedChild]
334 static belongsTo = MappedGroup
337 address column:'PERSON_ADDRESS_COLUMN
'
338 group column:'PERSON_GROUP_COLUMN
'
339 children column:'PERSON_CHILD_ID
'
340 cousins joinTable:[name:'COUSINS_TABLE
', key:'PERSON_ID
', column:'COUSIN_ID
']
343 static constraints = {
345 address(nullable:true)
353 class MappedAddress {
357 static belongsTo = MappedPerson
366 static hasMany = [people:MappedPerson, partners:MappedPartner]
369 partners column:'PARTNER_JOIN_COLUMN
', joinTable:'PARTNER_GROUP_ASSOCIATIONS
'
374 class MappedPartner {
379 static belongsTo = MappedGroup
380 static hasMany = [groups:MappedGroup]
383 groups column:'GROUP_JOIN_COLUMN
', joinTable:'PARTNER_GROUP_ASSOCIATIONS
'
394 tablePerHierarchy false
397 class CreditCardPayment extends Payment {
401 class CompositePerson implements Serializable {
408 id composite:['firstName
', 'lastName
']
418 static hasMany = [children:Relative, cousins:Relative]
422 cache usage:'read
-only
', include:'non
-lazy
'
423 id generator:'hilo
', params:[table:'hi_value
',column:'next_value
',max_lo:100]
426 firstName name:'First_Name
'
427 children lazy:false, cache:'read
-write
\'
441 firstName type
:'text', index
:'name_index'
442 lastName index
:'name_index,other_index'
455 cache usage
:'read-write', include
:'non-lazy'
456 id column
:'person_id'
459 firstName name
:'First_Name'