apache / apache/grails-core

tablePerHierarchy = false ignored when extending an abstract entity class

Open
#14,423 0 comments 0 reactions 0 assignees View on GitHub
relates-to: grails-data-hibernate5
Dominant language
Groovy
Stars
2.9k
Forks
975
Avg merge
1d 22h
Merged PRs (30d)
92

Description

When trying to get DevTeamEntity from database, I get
`org.h2.jdbc.JdbcSQLSyntaxErrorException: Column "MEN0_.CLASS" not found; SQL statement:`
even though I've specified tablePerHierarchy false
```
abstract class MasterEntity implements Identifiable {
Long id
static constraints = {
}
}
```

```
class PersonEntity extends MasterEntity {
Long weight
static mapping = {
tablePerHierarchy false
}
}
```

```
class ManEntity extends PersonEntity {
String firstName
String lastName
DevTeamEntity devTeamEntity
}
```

```
class DevTeamEntity {
Long id
static hasMany = [
men: ManEntity
]
}

```

```
2021-06-14 23:56:36.296 ERROR --- [nio-8080-exec-9] o.h.engine.jdbc.spi.SqlExceptionHelper : Column "MEN0_.CLASS" not found; SQL statement:
select men0_.dev_team_entity_id as dev_team3_1_0_, men0_.id as id1_1_0_, men0_.id as id1_2_1_, men0_1_.version as version2_2_1_, men0_1_.weight as weight4_2_1_, men0_.first_name as first_na2_1_1_, men0_.dev_team_entity_id as dev_team3_1_1_, men0_.last_name as last_nam4_1_1_ from man_entity men0_ inner join master_entity men0_1_ on men0_.id=men0_1_.id inner join master_entity men0_2_ on men0_.id=men0_2_.id where ( men0_.class in ('bug_2.ManEntity')) and men0_.dev_team_entity_id=? [42122-199]
2021-06-14 23:56:36.320 ERROR --- [nio-8080-exec-9] .a.c.c.C.[.[.[.[grailsDispatcherServlet] : Servlet.service() for servlet [grailsDispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.grails.gsp.GroovyPagesException: Error processing GroovyPageView: [views/devTeamEntity/show.gsp:22] Error executing tag : could not prepare statement] with root cause

org.h2.jdbc.JdbcSQLSyntaxErrorException: Column "MEN0_.CLASS" not found; SQL statement:
select men0_.dev_team_entity_id as dev_team3_1_0_, men0_.id as id1_1_0_, men0_.id as id1_2_1_, men0_1_.version as version2_2_1_, men0_1_.weight as weight4_2_1_, men0_.first_name as first_na2_1_1_, men0_.dev_team_entity_id as dev_team3_1_1_, men0_.last_name as last_nam4_1_1_ from man_entity men0_ inner join master_entity men0_1_ on men0_.id=men0_1_.id inner join master_entity men0_2_ on men0_.id=men0_2_.id where ( men0_.class in ('bug_2.ManEntity')) and men0_.dev_team_entity_id=? [42122-199]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:451)
at org.h2.message.DbException.getJdbcSQLException(DbException.java:427)
at org.h2.message.DbException.get(DbException.java:205)
at org.h2.message.DbException.get(DbException.java:181)
at org.h2.expression.ExpressionColumn.getColumnException(ExpressionColumn.java:176)
at org.h2.expression.ExpressionColumn.optimize(ExpressionColumn.java:158)
at org.h2.expression.condition.ConditionIn.optimize(ConditionIn.java:89)
at org.h2.expression.condition.ConditionAndOr.optimize(ConditionAndOr.java:133)
at org.h2.expression.condition.ConditionAndOr.optimize(ConditionAndOr.java:133)
at org.h2.command.dml.Select.prepare(Select.java:1248)
at org.h2.command.Parser.prepareCommand(Parser.java:689)
at org.h2.engine.Session.prepareLocal(Session.java:627)
at org.h2.engine.Session.prepareCommand(Session.java:565)
at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1292)
at org.h2.jdbc.JdbcPreparedStatement.(JdbcPreparedStatement.java:77)
at org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:349)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy$LazyConnectionInvocationHandler.invoke(LazyConnectionDataSourceProxy.java:385)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy$TransactionAwareInvocationHandler.invoke(TransactionAwareDataSourceProxy.java:241)
at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$5.doPrepare(StatementPreparerImpl.java:149)
at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:176)
at org.hibernate.engine.jdbc.internal.StatementPreparerImpl.prepareQueryStatement(StatementPreparerImpl.java:151)
at org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.prepareQueryStatement(AbstractLoadPlanBasedLoader.java:198)
at org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.executeQueryStatement(AbstractLoadPlanBasedLoader.java:162)
at org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.executeLoad(AbstractLoadPlanBasedLoader.java:104)
at org.hibernate.loader.collection.plan.AbstractLoadPlanBasedCollectionInitializer.initialize(AbstractLoadPlanBasedCollectionInitializer.java:87)
at org.hibernate.persister.collection.AbstractCollectionPersister.initialize(AbstractCollectionPersister.java:710)
at org.hibernate.event.internal.DefaultInitializeCollectionEventListener.onInitializeCollection(DefaultInitializeCollectionEventListener.java:76)
at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:102)
at org.hibernate.internal.SessionImpl.initializeCollection(SessionImpl.java:2161)
at org.hibernate.collection.internal.AbstractPersistentCollection$4.doWork(AbstractPersistentCollection.java:589)
at org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:264)
at org.hibernate.collection.internal.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:585)
at org.hibernate.collection.internal.AbstractPersistentCollection.read(AbstractPersistentCollection.java:149)
at org.hibernate.collection.internal.AbstractPersistentCollection$1.doWork(AbstractPersistentCollection.java:178)
at org.hibernate.collection.internal.AbstractPersistentCollection$1.doWork(AbstractPersistentCollection.java:163)
at org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:264)
at org.hibernate.collection.internal.AbstractPersistentCollection.readSize(AbstractPersistentCollection.java:162)
at org.hibernate.collection.internal.PersistentSet.isEmpty(PersistentSet.java:174)
at grails.plugin.formfields.FormFieldsTagLib.buildModel(FormFieldsTagLib.groovy:458)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at grails.plugin.formfields.FormFieldsTagLib$_closure8$_closure22.doCall(FormFieldsTagLib.groovy:334)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at org.grails.taglib.TagBodyClosure.executeClosure(TagBodyClosure.java:198)
at org.grails.taglib.TagBodyClosure.captureClosureOutput(TagBodyClosure.java:102)
at org.grails.taglib.TagBodyClosure.call(TagBodyClosure.java:223)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at gsp_fields_templates__fields_list_gsp.run(gsp_fields_templates__fields_list_gsp.groovy:26)
at org.grails.gsp.GroovyPageWritable.doWriteTo(GroovyPageWritable.java:145)
at org.grails.gsp.GroovyPageWritable.writeTo(GroovyPageWritable.java:82)
at org.grails.web.gsp.GroovyPagesTemplateRenderer.makeTemplate(GroovyPagesTemplateRenderer.java:232)
at org.grails.web.gsp.GroovyPagesTemplateRenderer.render(GroovyPagesTemplateRenderer.java:113)
at org.grails.plugins.web.taglib.RenderTagLib$_closure7.doCall(RenderTagLib.groovy:367)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at org.grails.taglib.TagOutput.captureTagOutput(TagOutput.java:78)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at grails.artefact.gsp.TagLibraryInvoker$Trait$Helper.methodMissing(TagLibraryInvoker.groovy:90)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at grails.plugin.formfields.FormFieldsTagLib$_closure8.doCall(FormFieldsTagLib.groovy:332)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at org.grails.gsp.GroovyPage.invokeTagLibClosure(GroovyPage.java:446)
at org.grails.gsp.GroovyPage.invokeTag(GroovyPage.java:364)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at home_jerry_dev_bug_2_grails_app_views_devTeamEntity_show_gsp$_run_closure2.doCall(home_jerry_dev_bug_2_grails_app_views_devTeamEntity_show_gsp:59)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at org.grails.taglib.TagBodyClosure.executeClosure(TagBodyClosure.java:200)
at org.grails.taglib.TagBodyClosure.captureClosureOutput(TagBodyClosure.java:102)
at org.grails.taglib.TagBodyClosure.call(TagBodyClosure.java:213)
at org.grails.plugins.web.taglib.SitemeshTagLib.captureTagContent(SitemeshTagLib.groovy:48)
at org.grails.plugins.web.taglib.SitemeshTagLib$_closure3.doCall(SitemeshTagLib.groovy:156)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at org.grails.gsp.GroovyPage.invokeTagLibClosure(GroovyPage.java:446)
at org.grails.gsp.GroovyPage.invokeTag(GroovyPage.java:364)
at home_jerry_dev_bug_2_grails_app_views_devTeamEntity_show_gsp.run(home_jerry_dev_bug_2_grails_app_views_devTeamEntity_show_gsp:76)
at org.grails.gsp.GroovyPageWritable.doWriteTo(GroovyPageWritable.java:145)
at org.grails.gsp.GroovyPageWritable.writeTo(GroovyPageWritable.java:82)
at org.grails.web.servlet.view.GroovyPageView.renderTemplate(GroovyPageView.java:76)
at org.grails.web.servlet.view.AbstractGrailsView.renderWithinGrailsWebRequest(AbstractGrailsView.java:71)
at org.grails.web.servlet.view.AbstractGrailsView.renderMergedOutputModel(AbstractGrailsView.java:55)
at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:317)
at org.grails.web.sitemesh.GrailsLayoutView.renderInnerView(GrailsLayoutView.java:150)
at org.grails.web.sitemesh.GrailsLayoutView.obtainContent(GrailsLayoutView.java:128)
at org.grails.web.sitemesh.GrailsLayoutView.renderTemplate(GrailsLayoutView.java:63)
at org.grails.web.servlet.view.AbstractGrailsView.renderWithinGrailsWebRequest(AbstractGrailsView.java:71)
at org.grails.web.servlet.view.AbstractGrailsView.renderMergedOutputModel(AbstractGrailsView.java:55)
at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:317)
at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1372)
at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1118)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1057)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
at org.grails.web.servlet.mvc.GrailsWebRequestFilter.doFilterInternal(GrailsWebRequestFilter.java:77)
at org.grails.web.filters.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:67)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:829)
```

Contributor guide

Open the contributing guide

Research direction

Start by reproducing the reported query with MasterEntity, PersonEntity, ManEntity, and DevTeamEntity, focusing on the tablePerHierarchy mapping and the generated SQL shown in the report. No repository file or test is identified, so locate the relevant inheritance-mapping tests or entry points before making changes. Done means loading DevTeamEntity no longer queries a missing CLASS column.

Written by the indexing model from the issue text.

Assessment

Tech stack
groovy
Domain
backend, database
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Needs clarification
Newbie friendliness
25/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.