当与 Spring 数据和 @Entity 一起使用时,Kotlin class 继承为 'gradle build' 抛出错误
Kotlin class inheritance throws error for 'gradle build' when used with Spring Data & @Entity
我有一个名为 Character
的简单实体,看起来像这样:
import javax.persistence.Entity
import javax.persistence.Id
import javax.persistence.Table
@Entity
@Table(name = "\"character\"")
class Character(
@Id
val id: String,
val name: String,
position: Position,
) : GameEntity(position) {
override fun equals(other: Any?): Boolean {
if (this === other) return true
if (javaClass != other?.javaClass) return false
other as Character
if (id != other.id) return false
return true
}
override fun hashCode(): Int {
return id.hashCode()
}
override fun toString(): String {
return "Character(id='$id', name='$name', position=$position)"
}
}
它源自 GameEntity
就是这样:
open class GameEntity(
val position: Position
)
当我运行gradle clean build
抛出以下异常
java.lang.IllegalStateException: No noarg super constructor for CLASS CLASS name:Character modality:OPEN visibility:public superTypes:[com.barbarus.state.entity.GameEntity]:
CONSTRUCTOR IR_EXTERNAL_DECLARATION_STUB visibility:public <> (position:com.barbarus.state.entity.Position) returnType:com.barbarus.state.entity.GameEntity [primary]
at org.jetbrains.kotlin.noarg.NoArgIrTransformer.getOrGenerateNoArgConstructor(NoArgIrGenerationExtension.kt:66)
at org.jetbrains.kotlin.noarg.NoArgIrTransformer.visitClass(NoArgIrGenerationExtension.kt:51)
at org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid$DefaultImpls.visitClass(IrElementVisitorVoid.kt:44)
at org.jetbrains.kotlin.noarg.NoArgIrTransformer.visitClass(NoArgIrGenerationExtension.kt:33)
at org.jetbrains.kotlin.noarg.NoArgIrTransformer.visitClass(NoArgIrGenerationExtension.kt:33)
at org.jetbrains.kotlin.ir.declarations.IrClass.accept(IrClass.kt:55
[...]
在我看来,您需要向 GameEntity
class 添加一个无参数构造函数,如下所示:
open class GameEntity(val position: String) {
constructor(): this("")
}
关于 Character
可能也是如此,因为 JPA 要求在 JPA 实体中提供无参数构造函数:
An entity class must follow these requirements.
- The class must be annotated with the javax.persistence.Entity annotation.
- The class must have a public or protected, no-argument constructor. The class may have other constructors.
- (...)
您可以在 https://docs.oracle.com/javaee/7/tutorial/persistence-intro001.htm 阅读更多内容。
我有一个名为 Character
的简单实体,看起来像这样:
import javax.persistence.Entity
import javax.persistence.Id
import javax.persistence.Table
@Entity
@Table(name = "\"character\"")
class Character(
@Id
val id: String,
val name: String,
position: Position,
) : GameEntity(position) {
override fun equals(other: Any?): Boolean {
if (this === other) return true
if (javaClass != other?.javaClass) return false
other as Character
if (id != other.id) return false
return true
}
override fun hashCode(): Int {
return id.hashCode()
}
override fun toString(): String {
return "Character(id='$id', name='$name', position=$position)"
}
}
它源自 GameEntity
就是这样:
open class GameEntity(
val position: Position
)
当我运行gradle clean build
抛出以下异常
java.lang.IllegalStateException: No noarg super constructor for CLASS CLASS name:Character modality:OPEN visibility:public superTypes:[com.barbarus.state.entity.GameEntity]:
CONSTRUCTOR IR_EXTERNAL_DECLARATION_STUB visibility:public <> (position:com.barbarus.state.entity.Position) returnType:com.barbarus.state.entity.GameEntity [primary]
at org.jetbrains.kotlin.noarg.NoArgIrTransformer.getOrGenerateNoArgConstructor(NoArgIrGenerationExtension.kt:66)
at org.jetbrains.kotlin.noarg.NoArgIrTransformer.visitClass(NoArgIrGenerationExtension.kt:51)
at org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid$DefaultImpls.visitClass(IrElementVisitorVoid.kt:44)
at org.jetbrains.kotlin.noarg.NoArgIrTransformer.visitClass(NoArgIrGenerationExtension.kt:33)
at org.jetbrains.kotlin.noarg.NoArgIrTransformer.visitClass(NoArgIrGenerationExtension.kt:33)
at org.jetbrains.kotlin.ir.declarations.IrClass.accept(IrClass.kt:55
[...]
在我看来,您需要向 GameEntity
class 添加一个无参数构造函数,如下所示:
open class GameEntity(val position: String) {
constructor(): this("")
}
关于 Character
可能也是如此,因为 JPA 要求在 JPA 实体中提供无参数构造函数:
An entity class must follow these requirements.
- The class must be annotated with the javax.persistence.Entity annotation.
- The class must have a public or protected, no-argument constructor. The class may have other constructors.
- (...)
您可以在 https://docs.oracle.com/javaee/7/tutorial/persistence-intro001.htm 阅读更多内容。