Тип значения атрибута «один ко многим» / «многие ко многим» не должен быть »? продолжается - PullRequest
1 голос
/ 22 марта 2020

Я пытаюсь определить простое отображение Hibernate, используя аннотации в Kotlin. Но мое отношение «многие ко многим» не работает, как ожидалось. Вызывает следующую ошибку в IntelliJ IDEA:

тип значения атрибута «один ко многим» / «много ко многим» не должен быть »? extends PersonAddress / Person '

Моя кодовая база:

@Entity
open class Person(
        @Id
        @GeneratedValue(strategy = GenerationType.SEQUENCE)
        var id: Long = 0L,

        @OneToMany(mappedBy = "person")
        var addresses: Set<PersonAddress> = setOf() //Fail

)

@Entity
open class Address(
        @Id
        @GeneratedValue(strategy = GenerationType.SEQUENCE)
        var id: Long = 0L,

        @OneToMany(mappedBy = "address")
        var persons: Set<PersonAddress> = setOf() //Fail

)

@Entity
open class PersonAddress(
        @Id
        var id: Long,

        @ManyToOne
        @JoinColumn(name = "person_id")
        var person: Person,

        @ManyToOne
        @JoinColumn(name = "address_id")
        var address: Address
) : Serializable

Так как я думал, что это может быть ошибкой, вызванной таблицей соединений, я попытался сделать то же самое для ManyToMany Соотношение:

 @ManyToMany(mappedBy = "addresses")
var persons: Set<Person> = setOf()

Но здесь возникает та же ошибка.

Application.kt

@SpringBootApplication
class Application {
    fun main(args: Array<String>) {
        runApplication<Application>(*args)
    }
}

build.gradle.kts

plugins {
    java
    id("org.springframework.boot") version "2.2.5.RELEASE"
    id("io.spring.dependency-management") version "1.0.9.RELEASE"
    kotlin("jvm")
    kotlin("plugin.spring") version "1.3.70"
    kotlin("plugin.jpa")
    kotlin("plugin.allopen") version "1.3.70"
}

val developmentOnly by configurations.creating
configurations {
    runtimeClasspath {
        extendsFrom(developmentOnly)
    }
}

repositories {
    mavenCentral()
}

dependencies {
    implementation("org.springframework.boot:spring-boot-starter-data-jpa")
    implementation("org.springframework.boot:spring-boot-starter-validation")
    implementation("org.jetbrains.kotlin:kotlin-reflect")
    implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
    runtimeOnly("com.h2database:h2")
    developmentOnly("org.springframework.boot:spring-boot-devtools")
    testImplementation("org.springframework.boot:spring-boot-starter-test") {
        exclude(group = "org.junit.vintage", module = "junit-vintage-engine")
    }
}

allOpen {
    annotation("javax.persistence.Entity")
    annotation("javax.persistence.Embeddable")
    annotation("javax.persistence.MappedSuperclass")
}

configure<JavaPluginConvention> {
    sourceCompatibility = JavaVersion.VERSION_1_8
}
tasks {
    compileKotlin {
        kotlinOptions.jvmTarget = "1.8"
    }
    compileTestKotlin {
        kotlinOptions.jvmTarget = "1.8"
    }
}

tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile> {
    kotlinOptions {
        freeCompilerArgs = listOf("-Xjsr305=strict")
        jvmTarget = "1.8"
    }
}

tasks.withType<Test> {
    useJUnitPlatform()
}

Редактировать 1: я избавился от ошибки, используя:

var persons: MutableList<PersonAddress> = mutableListOf()

Однако, просматривая мой код, происходит ошибка с атрибутами, которые хорошо работали вчера.

1 Ответ

1 голос
/ 22 марта 2020

Итак, чтобы ответить на мой собственный вопрос:

Поскольку я работаю с open классами, список должен быть изменяемой коллекцией. Сообщение об ошибке может быть лучше.

@OneToMany(mappedBy = "address")
var persons: MutableList<PersonAddress> = mutableListOf()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...