1

I have a Project Entity (as shown below). When I try to change

var fullName: String?= null

to:

var fullName: String,

I suddenly get an InstantiationException from Hibernate:

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

Before this there were no problems. What could be going wrong? Here is the Entity class:

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()
    )
Nora
  • 1,555
  • 6
  • 23
  • 40

2 Answers2

0

Provide a default value for fullName parameter or keep it nullable.

In your code, it does not have default value, so in generated Java bytecode Project class won't have a constructor without parameters - it will need at least 1 parameter to initialize fullName field.

ardenit
  • 3,070
  • 5
  • 16
  • I am creating an API and trying to avoid any default value. at the same time I don't want fullName to be null because it is a required field – Nora Jan 16 '20 at 13:04
  • Hibernate requires a default constructor. Default constructor is a constructor without parameters. If you want Kotlin to generate default constructor for data class, you have to set default parameters for every property declared in its primary constructor. – ardenit Jan 16 '20 at 13:09
  • Look at the answers here https://stackoverflow.com/questions/37873995/how-to-create-empty-constructor-for-data-class-in-kotlin-android – ardenit Jan 16 '20 at 13:23
0

You should provide a default constructor. You can make this private, if you dont want to expose it outside this class:

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()
    )

JavaBoy
  • 147
  • 7