【问题标题】:Mapping hasOne with belongsTo in Grails在 Grails 中将 hasOne 与 belongsTo 映射
【发布时间】:2017-11-06 04:39:11
【问题描述】:

旧数据库示例(如下所述):

我的父表具有复合主键,id1 自动生成为 SERIAL(1),id2 只有默认值。 子表具有完全相同的主键,也就是父表的外键。

子表类似于“加号”表或扩展父表。我们需要父表中的其他列,但我们不能更改父表。所以他们为我们创建了带有附加信息的子表,将外键从父表添加到子表,并将这个复合键作为主键:)

我尝试以这种方式在 Grails 中映射它:

Parent.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'
         }
    }
}

} Parent 有一个或零个具有复合键 id1、id2 的 Child。 Child属于Parent(与parent一起保存和删除),有外键Parent的主键,这个复合外键也是他的主键。

当有一些行时,Hibernate 无法返回值(空表没问题 :) - 我认为它报告了相同的错误 here(但这次已经解决了)。

技术信息: 数据库:MaxDB(旧版)也在 H2 嵌入式上进行了测试

  • grailsVersion=3.2.9
  • 编译“org.grails.plugins:hibernate5”
  • 编译“org.hibernate:hibernate-core:5.1.3.Final”
  • 编译'org.hibernate:hibernate-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

【问题讨论】:

  • hasMany 在同一设置中没有问题。可能是休眠中的错误?

标签: hibernate grails grails-orm belongs-to has-one


【解决方案1】:

我知道这个问题有些陈旧,但我认为与您的问题相同。

无论如何,经过一些调试和研究,我的工作开始了。我所要做的就是将获取行为切换为“加入”,这样它将在同一个 sql 查询中获取父项和子项。请注意,这可能意味着性能瓶颈取决于您的用例。

static mapping = {
    child fetch: 'join'
}

编辑:refresh() 仍然不起作用

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-17
    • 1970-01-01
    • 1970-01-01
    • 2016-02-29
    • 2017-07-08
    • 2013-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多