Search code examples
kotlinmicronautmicronaut-data

Micronaut Data simple parent/children relation


Hi I am trying to start a project with Micronaut Data in Kotlin and I am trying to get a simple table relation going. However I am having trouble using the micronaut annotations. The parent and child entities are the following:

import io.micronaut.data.annotation.GeneratedValue
import io.micronaut.data.annotation.Id
import io.micronaut.data.annotation.MappedEntity
import io.micronaut.data.annotation.Relation

@MappedEntity
class Parent(
  @Id
  @GeneratedValue
  var id: Long?,
  var name: String?,
  @Relation(value = Relation.Kind.ONE_TO_MANY, mappedBy = "parent")
  val children: Set<Child>?
){
}
import io.micronaut.data.annotation.GeneratedValue
import io.micronaut.data.annotation.Id
import io.micronaut.data.annotation.MappedEntity
import io.micronaut.data.annotation.Relation

@MappedEntity
class Child(
  @Id
  @GeneratedValue
  var id: Long?,
  var name: String?,
  @Relation(value = Relation.Kind.MANY_TO_ONE)
  var parent: Parent?
){
}

and my error reads the following:

io.micronaut.context.exceptions.BeanInstantiationException: Bean definition [io.micronaut.data.jdbc.config.SchemaGenerator] could not be loaded: Error instantiating bean of type [io.micronaut.data.jdbc.config.SchemaGenerator]: Identity cannot be missing for: de.mphoenix.data.entities.Parent
    at io.micronaut.context.DefaultBeanContext.initializeContext(DefaultBeanContext.java:1939)
    at io.micronaut.context.DefaultApplicationContext.initializeContext(DefaultApplicationContext.java:236)
    at io.micronaut.context.DefaultBeanContext.readAllBeanDefinitionClasses(DefaultBeanContext.java:3454)
    at io.micronaut.context.DefaultBeanContext.start(DefaultBeanContext.java:330)
    at io.micronaut.context.DefaultApplicationContext.start(DefaultApplicationContext.java:182)
    at io.micronaut.runtime.Micronaut.start(Micronaut.java:72)
    at de.mphoenix.ApplicationKt.main(Application.kt:8)
Caused by: io.micronaut.context.exceptions.BeanInstantiationException: Error instantiating bean of type [io.micronaut.data.jdbc.config.SchemaGenerator]: Identity cannot be missing for: de.mphoenix.data.entities.Parent
    at io.micronaut.context.DefaultBeanContext.doCreateBean(DefaultBeanContext.java:2366)
    at io.micronaut.context.DefaultBeanContext.createAndRegisterSingletonInternal(DefaultBeanContext.java:3282)
    at io.micronaut.context.DefaultBeanContext.loadContextScopeBean(DefaultBeanContext.java:2665)
    at io.micronaut.context.DefaultBeanContext.initializeContext(DefaultBeanContext.java:1933)
    ... 6 common frames omitted
Caused by: java.lang.IllegalStateException: Identity cannot be missing for: de.mphoenix.data.entities.Parent
    at io.micronaut.data.model.query.builder.AbstractSqlLikeQueryBuilder.traversePersistentProperties(AbstractSqlLikeQueryBuilder.java:1341)
    at io.micronaut.data.model.query.builder.AbstractSqlLikeQueryBuilder.traversePersistentProperties(AbstractSqlLikeQueryBuilder.java:1278)
    at io.micronaut.data.model.query.builder.sql.SqlQueryBuilder.buildCreateTableStatements(SqlQueryBuilder.java:448)
    at io.micronaut.data.jdbc.config.SchemaGenerator.createSchema(SchemaGenerator.java:145)
    at io.micronaut.data.jdbc.config.$SchemaGenerator$Definition.initialize(Unknown Source)
    at io.micronaut.data.jdbc.config.$SchemaGenerator$Definition.build(Unknown Source)
    at io.micronaut.context.DefaultBeanContext.doCreateBean(DefaultBeanContext.java:2337)
    ... 9 common frames omitted

If i remove the relation parameters in the constructor everything is fine so it has to be something wrong with the relations but I can't wrap my head around it. Can anyone help please?


Solution

  • Just add @field:Id instead of @Id annotation and it should work.

    See chapter 8.1.5.12 Support for Kotlin immutable data classes at https://micronaut-projects.github.io/micronaut-data/latest/guide/#kotlinData