代码之家  ›  专栏  ›  技术社区  ›  Jim C

org.hibernate.InstantiationException:使用org.jetbrains.kotlin.plugin.noarg时实体没有默认构造函数

  •  0
  • Jim C  · 技术社区  · 4 年前

    相关信息:我正在使用Kotlin和Hibernate以及gradle。

    可能相关信息:我根本不用Spring。我使用的是Micronaut数据

    问题:

    当我尝试一个简单的

    curl --location --request GET 'localhost:8080/accountholders?id=1'
    

    我明白了

    [default-nioEventLoopGroup-1-3] ERROR i.m.h.s.netty.RoutingInBoundHandler - Unexpected error occurred: org.hibernate.InstantiationException: No default constructor for entity:  : com.mybank.model.AccountHolder
    javax.persistence.PersistenceException: org.hibernate.InstantiationException: No default constructor for entity:  : com.mybank.model.AccountHolder
        at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:154)
        at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1542)
        at org.hibernate.query.internal.AbstractProducedQuery.uniqueResult(AbstractProducedQuery.java:1575)
        at org.hibernate.query.internal.AbstractProducedQuery.uniqueResultOptional(AbstractProducedQuery.java:1526)
        at io.micronaut.data.hibernate.operations.HibernateJpaOperations.lambda$findOne$2(HibernateJpaOperations.java:173)
        at io.micronaut.transaction.support.AbstractSynchronousTransactionManager.executeRead(AbstractSynchronousTransactionManager.java:155)
    ...
    Caused by: org.hibernate.InstantiationException: No default constructor for entity:  : com.mybank.model.AccountHolder
        at org.hibernate.tuple.PojoInstantiator.instantiate(PojoInstantiator.java:85)
    

    到处找我读的东西 kotlin reference 关于没有arg编译器插件。所以我加了一句,但我没有看到任何变化。可能还有一个额外的步骤

    noArg {
        annotation("com.my.Annotation")
    }
    

    noArg {
        invokeInitializers = true
    }
    

    拜托,有人能看看我的版本吗?gradle和entity告诉我到目前为止我遗漏了什么?

    plugins {
        id "org.jetbrains.kotlin.jvm" version "1.4.10"
        id "org.jetbrains.kotlin.kapt" version "1.4.10"
        id "org.jetbrains.kotlin.plugin.allopen" version "1.4.10"
        id "com.github.johnrengelman.shadow" version "6.1.0"
        id "io.micronaut.application" version '1.0.5'
        id "org.jetbrains.kotlin.plugin.noarg" version "1.4.10"
    }
    
    noArg {
        annotation("com.my.Annotation")
    }
    
    version "0.1"
    group "com.mybank"
    
    repositories {
        mavenCentral()
        jcenter()
    }
    
    micronaut {
        runtime "netty"
        testRuntime "junit5"
        processing {
            incremental true
            annotations "com.mybank.*"
        }
    }
    
    dependencies {
        kapt("io.micronaut.data:micronaut-data-processor")
        implementation("io.micronaut:micronaut-validation")
        implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8:${kotlinVersion}")
        implementation("org.jetbrains.kotlin:kotlin-reflect:${kotlinVersion}")
        implementation("io.micronaut.kotlin:micronaut-kotlin-runtime")
        implementation("io.micronaut:micronaut-runtime")
        implementation("javax.annotation:javax.annotation-api")
        implementation("io.micronaut:micronaut-http-client")
        implementation("io.micronaut.sql:micronaut-jdbc-hikari")
        implementation("io.micronaut.data:micronaut-data-hibernate-jpa")
        runtimeOnly("ch.qos.logback:logback-classic")
        runtimeOnly("com.fasterxml.jackson.module:jackson-module-kotlin")
        runtimeOnly("com.h2database:h2")
    }
    
    mainClassName = "com.mybank.ApplicationKt"
    java {
        sourceCompatibility = JavaVersion.toVersion('11')
    }
    
    compileKotlin {
        kotlinOptions {
            jvmTarget = '11'
        }
    }
    compileTestKotlin {
        kotlinOptions {
            jvmTarget = '11'
        }
    }
    

    优点:

    import javax.persistence.*
        
            @Entity
            @Table(name = "accounts")
            data class Account(@Id
                               //@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "account_generator")
                               //@SequenceGenerator(name = "account_generator", sequenceName = "account_seq")
                               @Column(name="ID_ACCOUNT", nullable=false)
                               //@GeneratedValue(strategy=GenerationType.SEQUENCE)
                               @GeneratedValue(strategy=GenerationType.IDENTITY)
                               var accountId: Long,
                               var name: String? = null,
            
            
                               @ManyToOne(fetch = FetchType.LAZY, optional = true)
                               @JoinColumn(name = "ACCOUNTHOLDER_ID", nullable=true, insertable=false, updatable=false)
                               val accountHolder: AccountHolder
            
            )
    

    import com.fasterxml.jackson.annotation.JsonFormat
    import com.fasterxml.jackson.databind.annotation.JsonDeserialize
    import com.fasterxml.jackson.databind.annotation.JsonSerialize
    import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer
    import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer
    import java.time.LocalDate
    import javax.persistence.*
    
    
    @Entity
    data class AccountHolder(@Id
                             //@GeneratedValue //(strategy = GenerationType.SEQUENCE, generator = "account_generator")
                             //@SequenceGenerator(name="account_generator", sequenceName = "account_seq")
                             @Column(name="accountHolderId", nullable=false)
                             //@GeneratedValue(strategy=GenerationType.SEQUENCE)
                             @GeneratedValue(strategy=GenerationType.IDENTITY)
                             var accountHolderId: Long,
                             var name: String? = null,
                             var age: Int,
                             @field:JsonFormat(pattern = "yyyy-MM-dd")
                             @field:JsonSerialize(using = LocalDateSerializer::class)
                             @field:JsonDeserialize(using = LocalDateDeserializer::class)
                             var birthDate: LocalDate,
                             var category: Category,
                             @Column(nullable = true)
                             @OneToMany(cascade = [CascadeType.ALL], fetch = FetchType.LAZY, mappedBy = "accountId")
                             val account: List<Account>? = null
    
    )
    

    存储库:

    import com.mybank.model.AccountHolder
    import io.micronaut.data.repository.CrudRepository
    import io.micronaut.context.annotation.Executable
    import io.micronaut.data.annotation.*
    
    @Repository
    interface AccountHolderRepository: CrudRepository<AccountHolder, Long> {
        @Executable
        fun find(name: String): AccountHolder
    }
    

    import com.mybank.model.Account
    import io.micronaut.data.annotation.Repository
    import io.micronaut.data.repository.CrudRepository
    
    @Repository
    interface AccountRepository : CrudRepository<Account, Long> {
    }
    

    控制器:

    import com.mybank.model.Account
    import com.mybank.service.AccountService
    import io.micronaut.http.MediaType
    import io.micronaut.http.annotation.*
    
    @Controller("/accounts")
    class AccountController(private val accountService: AccountService)
    {
    
        @Post
        @Consumes(MediaType.APPLICATION_JSON)
        fun addAccount(@Body account: Account): Account {
            return accountService.addAccount(account)
        }
    
        @Get
        fun getAccount(id: Long): Account {
            return accountService.findAccountById(id)
        }
    }
    

    import com.mybank.model.AccountHolder
    import com.mybank.service.AccountHolderService
    import io.micronaut.http.MediaType
    import io.micronaut.http.annotation.*
    
    @Controller("/accountholders")
    class AccountHolderController(private val accountHolderService: AccountHolderService) {
    
        @Post
        @Consumes(MediaType.APPLICATION_JSON)
        fun addAccountHolder(@Body accountHolder: AccountHolder): AccountHolder {
            return accountHolderService.addAccountHolder(accountHolder)
        }
    
        @Get
        fun getAccountHolder(id: Long): AccountHolder{
            return accountHolderService.findAccountHolderById(id)
        }
    }
    

    整个项目可以在 git hub master branch

    ***根据杰夫的建议编辑

    构建.gradle

    plugins {
        id "org.jetbrains.kotlin.jvm" version "1.4.10"
        id "org.jetbrains.kotlin.kapt" version "1.4.10"
        id "org.jetbrains.kotlin.plugin.allopen" version "1.4.10"
        id "com.github.johnrengelman.shadow" version "6.1.0"
        id "io.micronaut.application" version '1.0.5'
        id "org.jetbrains.kotlin.plugin.noarg" version "1.4.10"
    }
    
    noArg {
        annotation("com.my.Annotation")
    }
    
    version "0.1"
    group "com.mybank"
    
    repositories {
        mavenCentral()
        jcenter()
    }
    
    micronaut {
        runtime "netty"
        testRuntime "junit5"
        processing {
            incremental true
            annotations "com.mybank.*"
        }
    }
    
    dependencies {
        kapt("io.micronaut.data:micronaut-data-processor")
        implementation("io.micronaut:micronaut-validation")
        implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8:${kotlinVersion}")
        implementation("org.jetbrains.kotlin:kotlin-reflect:${kotlinVersion}")
        implementation("io.micronaut.kotlin:micronaut-kotlin-runtime")
        implementation("io.micronaut:micronaut-runtime")
        implementation("javax.annotation:javax.annotation-api")
        implementation("io.micronaut:micronaut-http-client")
        implementation("io.micronaut.sql:micronaut-jdbc-hikari")
        implementation("io.micronaut.data:micronaut-data-hibernate-jpa")
        runtimeOnly("ch.qos.logback:logback-classic")
        runtimeOnly("com.fasterxml.jackson.module:jackson-module-kotlin")
        runtimeOnly("com.h2database:h2")
    
    }
    
    mainClassName = "com.mybank.ApplicationKt"
    java {
        sourceCompatibility = JavaVersion.toVersion('11')
    }
    
    compileKotlin {
        kotlinOptions {
            jvmTarget = '11'
        }
    }
    compileTestKotlin {
        kotlinOptions {
            jvmTarget = '11'
        }
    }
    
    apply plugin: "kotlin-noarg"
    
    noArg {
        annotation("com.mybank.model.NoArg")
        invokeInitializers = true
    }
    

    诺亚格班

    @Target(AnnotationTarget.CLASS)
    @Retention(AnnotationRetention.SOURCE)
    annotation class NoArg
    

    实体

    @Entity
    @Table(name = "accounts")
    @NoArg
    data class Account(@Id
    

    other answer 但我知道这个问题的主题和我的完全不同:我清楚地问了关于kotlin noarg的问题,它在我使用的方式上出了问题,而在这个问题中peerson问“如何在kotlin Android中为数据类创建空构造函数”

    0 回复  |  直到 4 年前
    推荐文章