2012-07-11 22 views
6

Alan sınıflarımı Grails'e aşağıda gösterildiği gibi miras olarak modelledim. Daha sonra ben profillerin bazı takım veya Kullanıcı yayın yapmak istediğim bazı durumlarda sınıf B tüm profilleri elde kontrolörleri içinde Grails/Groovy etki alanı sınıfları kalıtım döküm

abstract class Profile{ 
} 

class Team extends Profile{ 
} 

class User extends Profile{ 
} 

class B{ 
    static hasMany = [profiles: Profile] 
} 

, ama ben bir java alamıyorum çünkü. lang.ClassCastException veya GroovyCastException, bir Ekip veya Kullanıcı olarak (veritabanında öznitelik sınıfıyla birlikte) kaydedilirler. İşte ben denedim yolu vardır: Bunun bir dinamik dilde normaldir olarak her tür sadece kullanmak yazmayın zaman

def team1 = b.profiles.toList()[0] as Team 

def team1 = (Team)b.profiles.toList()[0] 

çalışıyor.

def team1 = b.profiles.toList()[0] 

Ama sonra hangi sınıfı kullandığımı bilmiyorum. Ebeveyn sınıfını çocuğa çevirmek için groovy ya da gorm var mı?

+0

'arasında seçim yapmak Gorm'da için (http://grails.org/doc/latest/ref/Database%20Mapping/discriminator.html) hiçbir [diskriminatör] Orada Kullanıcı veya Takım. Hangi uygulamayı kullanacağına nasıl karar vermeli? – krock

+0

Veritabanındaki aynı tabloya hangi sınıfı gösteren bir sınıf özniteliği ile kaydeder. – sgleser87

cevap

4

Gerçek bir GORM/Hazırda Bekleme örneği olarak Hayır yanıtı proxied bir nesnedir. Yani doğrudan bir varlık sınıfına yayınlanamaz.

Neyse bu yardımcı olabilir:

def team1 = b.profiles.toList()[0] 
if(team1.instanceOf(Team)) { 
    // I am an instance of Team 
    // do something here. 
} 
+0

Çalışıyor, ama aslında bu benim sorum değildi. Sorum, temel sınıfı alt sınıfa açık bir şekilde yayınlamanın bir yolu olsaydı. – sgleser87

+3

Hayır, hazırda bekletme proxy'si zorunlu olarak, kelimenin Java anlamındaki alt sınıfın bir "instanceof" değeri değildir. Proxy sınıfı, _declared_ türündeki b.profiles'ın (yani 'Profile') dinamik olarak oluşturulmuş bir alt sınıfıdır. [Bu makale] (http://blog.springsource.org/2010/07/28/gorm-gotchas-part-3/), gory detaylarına sahiptir ve bu (ve aynı serideki diğer makaleler) iyi değerlerdir Oku –

+3

Her zaman proxy sarıcısını kaldıracak ve gerçek nesneyi (sonra da atabilirsiniz) verecek olan GrailsHibernateUtil.unwrapIfProxy' vardır, ancak gerçek nesne önceden yüklenmemişse bu veritabanına vurmak zorunda kalacaktır. –

İlgili konular