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?
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