2017-06-05 137 views
0

傳統數據庫的例子(下面降序): enter image description here映射hasOne與屬於關聯Grails中

我有一個具有複合主鍵,自動生成ID1作爲SERIAL(1),ID2只有默認值父表。 子表具有完全相同的主鍵,也是父表中的外鍵。

子表類似於「加」表或擴展父表。我們需要PArent表中的其他列,但我們不能更改父表。因此,他們爲我們提供更多信息子表創建的,從父表中添加外鍵子表,也使該組合鍵爲主:)

我嘗試它的Grails這樣映射:

父.groovy作爲

package test 
class Parent implements Serializable{ 
    Integer id1 
    Integer id2 
    String parentDesc 

    static hasOne = [child: Child] 

    static mappedBy = [child: 'parent'] 

    static constraints = { 
     child nullable:true 
    } 

    static mapping = { 
     table 'parent' 
     id   composite: ['id1', 'id2'] 
     id1  column: 'id1' 
     id2  column: 'id2' 
     parentDesc column: 'parent_desc' 
    } 
} 

Child.groovy

package test 

import java.io.Serializable 

class Child implements Serializable{ 
    Integer id1 
    Integer id2 
    Parent parent 
    String childDesc 

    static belongsTo = [parent: Parent] 

    static mapping = { 
     table 'child' 


     id  composite: ['id1', 'id2'] 
     id1  column: 'id1' 
     id2  column: 'id2' 
     childDesc column: 'child_desc' 
     columns { 
     parent(insertable: false, updateable: false) { 
      column name: 'id1' 
      column name: 'id2' 
     } 
    } 
} 

} 父項具有一個或零個子組合鍵id1,id2。子屬於Parent(保存和刪除父項),具有外鍵Parent的主鍵,而且這個組合外鍵也是他的主鍵。當有一些行時,Hibernate不能返回值(空表沒有問題:) - 我認爲它的同一個bug報告了here(但這次已經解決了)。

技術信息: 數據庫:MaxDB的(傳統)也嵌入式

  • grailsVersion H2測試= 3.2.9
  • 編譯 「org.grails.plugins:hibernate5」
  • compile「org.hibernate:hibernate-core:5.1.3.Final」
  • compile'org.hi bernate:休眠-java8:5.1.2.Final」
  • 編譯 'com.h2database:H2:1.4.193'
  • 編譯 「com.sap:sapdbc:7.4.4」

全部測試項目:dropbox

堆棧跟蹤:

[2m2017-06-05 13:59:26.063[0;39m [31mERROR[0;39m [2m---[0;39m [2m[nio-8080-exec-1][0;39m [36mo.g.web.errors.GrailsExceptionResolver [0;39m [2m:[0;39m NullPointerException occurred when processing request: [GET]/
Stacktrace follows: 

java.lang.reflect.InvocationTargetException: null 
    at org.grails.core.DefaultGrailsControllerClass$ReflectionInvoker.invoke(DefaultGrailsControllerClass.java:211) 
    at org.grails.core.DefaultGrailsControllerClass.invoke(DefaultGrailsControllerClass.java:188) 
    at org.grails.web.mapping.mvc.UrlMappingsInfoHandlerAdapter.handle(UrlMappingsInfoHandlerAdapter.groovy:90) 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963) 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897) 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) 
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861) 
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) 
    at org.springframework.boot.web.filter.ApplicationContextHeaderFilter.doFilterInternal(ApplicationContextHeaderFilter.java:55) 
    at org.grails.web.servlet.mvc.GrailsWebRequestFilter.doFilterInternal(GrailsWebRequestFilter.java:77) 
    at org.grails.web.filters.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:67) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:748) 
Caused by: java.lang.NullPointerException: null 
    at org.hibernate.persister.entity.AbstractEntityPersister.loadByUniqueKey(AbstractEntityPersister.java:2172) 
    at org.hibernate.type.EntityType.loadByUniqueKey(EntityType.java:692) 
    at org.hibernate.type.EntityType.resolve(EntityType.java:434) 
    at org.hibernate.engine.internal.TwoPhaseLoad.doInitializeEntity(TwoPhaseLoad.java:151) 
    at org.hibernate.engine.internal.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:125) 
    at org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:1139) 
    at org.hibernate.loader.Loader.processResultSet(Loader.java:998) 
    at org.hibernate.loader.Loader.doQuery(Loader.java:936) 
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:342) 
    at org.hibernate.loader.Loader.doList(Loader.java:2622) 
    at org.hibernate.loader.Loader.doList(Loader.java:2605) 
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2434) 
    at org.hibernate.loader.Loader.list(Loader.java:2429) 
    at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:109) 
    at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1787) 
    at org.hibernate.internal.CriteriaImpl.list(CriteriaImpl.java:363) 
    at org.grails.orm.hibernate.query.AbstractHibernateQuery.listForCriteria(AbstractHibernateQuery.java:700) 
    at org.grails.orm.hibernate.HibernateGormStaticApi$_list_closure1.doCall(HibernateGormStaticApi.groovy:87) 
    at org.grails.orm.hibernate.GrailsHibernateTemplate.doExecute(GrailsHibernateTemplate.java:286) 
    at org.grails.orm.hibernate.GrailsHibernateTemplate.execute(GrailsHibernateTemplate.java:230) 
    at org.grails.orm.hibernate.GrailsHibernateTemplate.execute(GrailsHibernateTemplate.java:116) 
    at org.grails.orm.hibernate.HibernateGormStaticApi.list(HibernateGormStaticApi.groovy:73) 
    at org.grails.orm.hibernate.HibernateGormStaticApi.list(HibernateGormStaticApi.groovy:72) 
    at org.grails.datastore.gorm.GormEntity$Trait$Helper.list(GormEntity.groovy:654) 
    at test.ParentController.$tt__index(ParentController.groovy:10) 
    at grails.transaction.GrailsTransactionTemplate$2.doInTransaction(GrailsTransactionTemplate.groovy:96) 
    at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:133) 
    at grails.transaction.GrailsTransactionTemplate.execute(GrailsTransactionTemplate.groovy:93) 
    ... 14 common frames omitted 
+0

沒有使用相同的設置中的hasMany沒有問題。可能在休眠時出錯? –

回答

0

我知道這闕stion有點舊,但我認爲和你的問題一樣。

無論如何,經過一些調試和研究,我得到了我的工作。我所要做的只是將獲取行爲切換爲「連接」,以便在相同的SQL查詢中獲取父級和子級。請注意,這可能意味着性能瓶頸取決於您的用例。

編輯:refresh()仍然無法正常工作,雖然