当前位置: 首页 > 面试题库 >

使用JPA的Kotlin:默认构造函数地狱

东方国安
2023-03-14
问题内容

按照JPA的要求,@Entity类应具有默认的(非arg)构造函数,以在从数据库中检索对象时实例化这些对象。

在Kotlin中,可以很方便地在主构造函数中声明属性,如以下示例所示:

class Person(val name: String, val age: Int) { /* ... */ }

但是,当将非arg构造函数声明为辅助构造函数时,它要求传递主要构造函数的值,因此需要一些有效值,例如:

@Entity
class Person(val name: String, val age: Int) {
    private constructor(): this("", 0)
}

如果属性的类型比just更复杂StringInt并且它们不能为null,那么为它们提供值看起来是非常糟糕的,尤其是当主要构造函数和init块中有很多代码以及有效使用参数时-
-当通过反射重新分配它们时,大多数代码将再次执行。

此外,val在构造函数执行后无法重新分配-properties,因此也失去了不变性。

所以问题是:如何在不进行代码重复,选择“魔术”初始值和丧失不变性的情况下,使Kotlin代码适合JPA。

PS是真的,除了JPA之外,Hibernate可以在没有默认构造函数的情况下构造对象吗?


问题答案:

从Kotlin 1.0.6开始kotlin-noarg编译器插件会为已使用选定注释进行注释的类生成综合默认构造函数。

如果您使用gradle,则应用kotlin-jpa插件足以为带注释的类生成默认构造函数@Entity

buildscript {
    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-noarg:$kotlin_version"
    }
}

apply plugin: "kotlin-jpa"

对于Maven:

<plugin>
    <artifactId>kotlin-maven-plugin</artifactId>
    <groupId>org.jetbrains.kotlin</groupId>
    <version>${kotlin.version}</version>

    <configuration>
        <compilerPlugins>
            <plugin>jpa</plugin>
        </compilerPlugins>
    </configuration>

    <dependencies>
        <dependency>
            <groupId>org.jetbrains.kotlin</groupId>
            <artifactId>kotlin-maven-noarg</artifactId>
            <version>${kotlin.version}</version>
        </dependency>
    </dependencies>
</plugin>


 类似资料:
  • 正如JPA所要求的,类应该有一个默认的(非参数)构造函数,以便在从数据库检索对象时实例化它们。 在Kotlin中,属性在主构造函数内声明非常方便,如下例所示: 但是当非arg构造函数被声明为次要构造函数时,它需要传递主构造函数的值,因此它们需要一些有效的值,如下所示: 如果属性具有比和更复杂的类型,并且它们是不可为空的,那么为它们提供值看起来是非常糟糕的,特别是当主构造函数和块中有很多代码,并且当

  • 问题内容: 我正在将Lombok项目与Spring Data JPA一起使用。有什么方法可以将Lombok 与JPA默认构造函数连接? 码: 据我所知,JPA需要默认的构造函数,该构造函数被注解覆盖。有什么解决方法吗? 这段代码给我错误: 问题答案: 更新 根据反馈和John的回答,我已更新了不再使用or的答案,而是通过和创建访问器和变量,通过创建默认构造函数via,最后我们创建了构建器通过via

  • 我想做一个简单的POJO(POKO?)在Kotlin中使用一个默认的空构造函数和一个带有参数的辅助构造函数创建一个类,该类提供属性 这并没有给我和属性: 这为我提供了属性,但它们在实例化后没有设置: 这给了我一个编译错误,说“不允许在二级构造函数参数上使用'var'”: 那么,这是怎么做到的?我如何拥有一个默认构造函数和一个带有参数和属性的二级构造函数?

  • 问题内容: 默认构造函数到底是什么?你能告诉我以下哪个是默认构造函数,它与其他构造函数有何不同? 问题答案: 他们都不是。如果定义,则不是默认值。 除非你定义另一个构造函数,否则默认构造函数是自动生成的无参数构造函数。任何未初始化的字段都将设置为其默认值。对于你的榜样,它看起来像这样假设的类型String,int以及int,那类本身是公共的: 这与 完全没有构造函数。但是,如果定义至少一个构造函数

  • Spring靴和jpa给出了错误 项目的github链接https://github.com/dishankgoyal/springsBoot/tree/master/faculty_project

  • 我将Lombok项目与Spring Data JPA一起使用。有没有办法将Lombok与JPA默认构造函数连接起来? 代码: 据我所知,JPA需要默认构造函数,该构造函数由注释覆盖。有什么解决办法吗? 这段代码给我错误:< code > org . hibernate . instantiation exception:entity::app . domain . model . person没有