InstantiationException: нет конструктора по умолчанию для сущности при создании поля сущности, которое не может быть обнулено в Kotlin - PullRequest
1 голос
/ 16 января 2020

У меня есть объект проекта (как показано ниже). Когда я пытаюсь изменить

var fullName: String?= null

на:

var fullName: String,

, я неожиданно получаю InstantiationException из Hibernate:

org.hibernate.InstantiationException: No default constructor for entity:

До этого проблем не было. Что может быть не так? Вот класс Entity:

package no.inmeta.ris.project.model.entity

import org.hibernate.annotations.GenericGenerator
import java.util.*
import javax.persistence.*

@Entity
data class Project (

    @Id
    @GeneratedValue(generator = "uuid2")
    @GenericGenerator(name = "uuid2", strategy = "uuid2")
    @Column(columnDefinition = "BINARY(16)")
    var id : UUID? = null,

    var fullName: String,

    var shortName: String? = null,

    var prevRefId: String? = null,

    var startDate: Date? = null,

    var endDate: Date?  = null,

    @ManyToMany(fetch = FetchType.EAGER)
    @JoinTable(name = "Associated_Projects",
        joinColumns = [JoinColumn(name = "associated_project")],
        inverseJoinColumns = [JoinColumn(name = "second_associated_project") ])
    var associatedProjects: List<Project?> = mutableListOf(),

    var shortDescription: String? = null,

    var summary: String?  = null,

    var url: String? = null,

    @ManyToMany(fetch = FetchType.EAGER)
    @JoinTable(name = "Project_Types",
        joinColumns = [JoinColumn(name = "project_id")],
        inverseJoinColumns = [JoinColumn(name = "type_id") ])
    var type: List<Type?> = mutableListOf()
    )

Ответы [ 2 ]

0 голосов
/ 16 января 2020

Вы должны предоставить конструктор по умолчанию. Вы можете сделать это приватным, если не хотите показывать его вне этого класса:

package no.inmeta.ris.project.model.entity

import org.hibernate.annotations.GenericGenerator
import java.util.*
import javax.persistence.*

@Entity
data class Project (

    @Id
    @GeneratedValue(generator = "uuid2")
    @GenericGenerator(name = "uuid2", strategy = "uuid2")
    @Column(columnDefinition = "BINARY(16)")
    var id : UUID? = null,

    var fullName: String,

    var shortName: String? = null,

    var prevRefId: String? = null,

    var startDate: Date? = null,

    var endDate: Date?  = null,

    private constructor()

    @ManyToMany(fetch = FetchType.EAGER)
    @JoinTable(name = "Associated_Projects",
        joinColumns = [JoinColumn(name = "associated_project")],
        inverseJoinColumns = [JoinColumn(name = "second_associated_project") ])
    var associatedProjects: List<Project?> = mutableListOf(),

    var shortDescription: String? = null,

    var summary: String?  = null,

    var url: String? = null,

    @ManyToMany(fetch = FetchType.EAGER)
    @JoinTable(name = "Project_Types",
        joinColumns = [JoinColumn(name = "project_id")],
        inverseJoinColumns = [JoinColumn(name = "type_id") ])
    var type: List<Type?> = mutableListOf()
    )

0 голосов
/ 16 января 2020

Укажите значение по умолчанию для параметра fullName или оставьте его обнуляемым.

В вашем коде оно не имеет значения по умолчанию, поэтому в сгенерированном Java байт-коде у класса Project не будет конструктора без параметров - для инициализации поля fullName потребуется как минимум 1 параметр.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...