Grails

2011-08-11 24 views
6

Kalıtım haritalandırmasında discriminator sorunu Ben aşağıda açıklanan kalıtım eşlemesi ile 4 sınıf A, B, B1, B2 var:
A (Tablo A ile eşleştirilen) en üstteki üst sınıf ve onun miras eşleme stratejisidir tablePerHierarchy=false (alt sınıflarının her biri tek bir tabloyla eşleştirilir).
B Sınıfı A ve B1, B2 B'den uzar. B1 ve B2 aynı tabloyu B ile paylaşır, bu nedenle B sınıfında, tablePerHierarchy=true ve B1 ve B2'yi ayırmak için bir ayırıcı beyan ederim. Grails

class A { 
    static mapping = { 
      tablePerHierarchy false 
      table 'A' 
    } 
} 

class B extends A { 
    static mapping = { 
      tablePerHierarchy true 
      table 'B' 
      discriminator column : 'TYPE' 
    } 
    String bProp1 
    String bProp2 
} 

class B1 extends B { 
    static mapping = { 
      discriminator column : 'TYPE', value : 'B1' 
    } 
    String b1Props1 
    String b1Props2 
} 

class B2 extends B { 
    static mapping = { 
      discriminator column : 'TYPE', value : 'B2' 
    } 
    String b2Props1 
    String b2Props1 
} 

Uygulamamı başlatmak

bir hata oluştu var:
detay kodu burada

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'messageSource': Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'transactionManager': Cannot resolve reference to bean 'sessionFactory' while setting bean property 'sessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory': Invocation of init method failed; nested exception is org.hibernate.MappingException: No discriminator found for edu.test.B1. Discriminator is needed when 'single-table-per-hierarchy' is used and a class has subclasses 
    at org.grails.tomcat.TomcatServer.start(TomcatServer.groovy:212) 
    at grails.web.container.EmbeddableServer$start.call(Unknown Source) 
    at _GrailsRun_groovy$_run_closure5_closure12.doCall(_GrailsRun_groovy:158) 
    at _GrailsRun_groovy$_run_closure5_closure12.doCall(_GrailsRun_groovy) 
    at _GrailsSettings_groovy$_run_closure10.doCall(_GrailsSettings_groovy:280) 
    at _GrailsSettings_groovy$_run_closure10.call(_GrailsSettings_groovy) 
    at _GrailsRun_groovy$_run_closure5.doCall(_GrailsRun_groovy:149) 
    at _GrailsRun_groovy$_run_closure5.call(_GrailsRun_groovy) 
    at _GrailsRun_groovy.runInline(_GrailsRun_groovy:116) 
    at _GrailsRun_groovy.this$4$runInline(_GrailsRun_groovy) 
    at _GrailsRun_groovy$_run_closure1.doCall(_GrailsRun_groovy:59) 
    at RunApp$_run_closure1.doCall(RunApp:33) 
    at gant.Gant$_dispatch_closure5.doCall(Gant.groovy:381) 
    at gant.Gant$_dispatch_closure7.doCall(Gant.groovy:415) 
    at gant.Gant$_dispatch_closure7.doCall(Gant.groovy) 
    at gant.Gant.withBuildListeners(Gant.groovy:427) 
    at gant.Gant.this$2$withBuildListeners(Gant.groovy) 
    at gant.Gant$this$2$withBuildListeners.callCurrent(Unknown Source) 
    at gant.Gant.dispatch(Gant.groovy:415) 
    at gant.Gant.this$2$dispatch(Gant.groovy) 
    at gant.Gant.invokeMethod(Gant.groovy) 
    at gant.Gant.executeTargets(Gant.groovy:590) 
    at gant.Gant.executeTargets(Gant.groovy:589) 
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'transactionManager': Cannot resolve reference to bean 'sessionFactory' while setting bean property 'sessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory': Invocation of init method failed; nested exception is org.hibernate.MappingException: No discriminator found for edu.test.B1. Discriminator is needed when 'single-table-per-hierarchy' is used and a class has subclasses 
    ... 23 more 
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory': Invocation of init method failed; nested exception is org.hibernate.MappingException: No discriminator found for edu.test.B1. Discriminator is needed when 'single-table-per-hierarchy' is used and a class has subclasses 
    ... 23 more 
Caused by: org.hibernate.MappingException: No discriminator found for edu.test.B1. Discriminator is needed when 'single-table-per-hierarchy' is used and a class has subclasses 
    ... 23 more 

ben discriminator (http://grails.org/doc/latest/ref/Database%20Mapping/discriminator.html) hakkında Grails belgelerin talimat takip ama etmedi iş. Bu belge sorunuyla ilgili bir JIRA'yı burada buldum: http://jira.grails.org/browse/GRAILS-5168 ve yorum yazdıkları gibi kodlarımı düzelttim ama yine de aynı hatayı aldım.

Bu soruna neden olan sebebi bilmiyorum. TablePerHierarchy = B'de true, A'da tanımlanan stratejiyi geçersiz kılar mı?
Bu sorunu düzeltmeme yardımcı olabilir misiniz? Çok teşekkür ederim.

+0

kabul edilen yanıtları işaretlemelisiniz – dbrin

cevap

1

Sınıf hiyerarşisi için miras stratejilerini karıştırma, JPA/Hazırda Bekleme düzeyine kadar bile desteklenmiyor gibi görünüyor. Ben Sorununuz bu (ya da en azından çok benzer) ile aynı olduğunu düşünüyorum:

Changing the inheritance strategy in branches of the class hierarchy via JPA annotations

How to mix inheritance strategies with JPA annotations and Hibernate?

sen 'org.codehaus.groovy.grails.orm için günlüğe kaydetme ayarlarını değiştirirseniz .hibernate 'debug' için 'B sınıfındaki' tablePerHierarchy = true 'ayarının A'daki stratejiyi geçersiz kılmadığını görebilirsiniz. Buna rağmen, işe yaramıyor. Yine, GORM'den daha düşük bir seviyede bir sınırlama gibi görünüyor. Bu hiyerarşi için tasarımınızı bir miras stratejisi kullanacak şekilde revize edebilir misiniz?