Tag: JPA

与JPA Kotlin:默认构造函数地狱

按照JPA的要求,@ @Entity类应该有一个默认的(非arg)构造函数来从数据库中检索对象时实例化对象。 在Kotlin中,属性在主构造函数中声明非常方便,如下例所示: class Person(val name: String, val age: Int) { /* … */ } 但是,当非参数构造函数被声明为次要构造函数时,它需要传递主构造函数的值,所以需要一些有效的值,如下所示: @Entity class Person(val name: String, val age: Int) { private constructor(): this(“”, 0) } 如果这些属性比String和Int有更复杂的types,并且它们是不可空的,那么为它们提供值看起来完全不好,特别是当主构造函数和init块中有很多代码,并且参数是积极使用 – 当它们被重新分配时,大部分代码将被重新执行。 而且, val -properties不能在构造函数执行后重新分配,所以不可变性也会丢失。 所以问题是:Kotlin代码如何适应与JPA无代码重复,选择“魔术”的初始值和不可变性的损失? PS除了JPA,Hibernate是否可以构造没有默认构造函数的对象呢?

JPA实现不需要无参数构造函数

有没有实现JPA的ORM框架,但不需要@Entity类的默认(无参数)构造函数? AFAIK,在JPA文档中说,一个@Entity应该有默认的构造函数,但是一个实现是否支持构造函数参数注入(或者可能是不安全的对象实例化),因此使用没有默认构造函数的类? 这个特性对于确保不变性( 标准的 JPA缺少)有很大的帮助,并且可以让开发人员对类实例状态保持严格的不variables(例如,它的字段总是有正确的值)。 顺便说一下,当使用Kotlin时,无参构造函数的需要会干扰良好的代码风格和编码约定。 有JIRM库处理构造函数注入和不可变性,但它不是一个完整的JPA实现。 那么,是否有任何JPA ORM支持@Entity类没有默认的构造函数?

Kotlin与JPA / Hibernate:没有“开放”没有懒加载?

大多数Kotlin JPA示例代码看起来像这样 class Person(val name: String, val age: Int) { /* … */ } 甚至 data class Person(val name: String=””, val age: Int=0) { /* … */ } 现在,“ Hibernate用户指南”和其他几个ORM都指出,他们通常要创建代理或扩展模型类,但要允许在Kotlin中将类明确定义为open 。 这对于数据类来说目前是不可能的,从我自己的经验来看,大多数人在Kotlin编写JPA实体时并没有考虑这个问题。 所以,来我的问题(毕竟这是stackoverflow),是否足够 open class Person(val name: String, val age: Int) { /* … */ } 或者我们真的不得不这样做 open class Person(open val name: String, open val […]

如何添加kotlin类到gradle JavaCompile任务

我用spring引导来使用kotlin和java来开发我的项目。 我的构建工具是gradle,一个任务定义如下: configurations { providedRuntime jpametamodel } dependencies { jpametamodel (‘org.hibernate:hibernate-jpamodelgen:4.3.11.Final’) } task generateMetaModel(type: JavaCompile, group: ‘build’, description: ‘metamodel generate’) { source = sourceSets.main.java classpath = configurations.compile + configurations.jpametamodel options.compilerArgs = [“-proc:only”] destinationDir = sourceSets.generated.java.srcDirs.iterator().next() doFirst { delete(sourceSets.generated.java.srcDirs) } } 这个任务适用于kotlin类,但是如果我添加kotlin类,任务不能通过抛出以下错误: Hibernate JPA 2 Static-Metamodel Generator 4.3.11.Final /…/src/main/java/com/app/web/rest/UserResource.java:18: Cannot find ….. import com.app.web.rest.dto.SimpleUser; ^ Symbol: […]

带有Gradle和Kotlin的JOOQ不会生成文件

我在build.gradle.kts中有以下gradle任务。 它应该从我的JPA实体生成文件。 但是,运行此任务时,一旦成功,将不会生成文件或目录。 task(name = “generateJooq”) { doLast { val configuration = Configuration().apply { generator = Generator().apply { database = Database().apply { name = “org.jooq.util.jpa.JPADatabase” properties = listOf(Property().apply { key = “packages” value = “com.example.sample” }) } target = Target().apply { packageName = “com.example.jooq” directory = “src/generated/java” } } } GenerationTool.generate(configuration) } } 这是我的实体生活在包com.example.sample 。 […]

Kotlin数据类inheritance+复制方法

我从个人经验和这个讨论中了解到,当一个data classinheritance自另一个inheritance了类的字段的类不包含在数据类的copy函数中。 我感兴趣的是解决这个问题的选项。 具体来说,我有一个JPA @MappedSuperClass为我的JPA实体,这是data class ES。 在超类中,我设置了实体ID,至少到目前为止,我总是希望以相同的方式进行操作。 还有一些其他的事情我也想做,比如设置一个创建日期,最后更新日期等。 我到目前为止考虑的选项: 将ID,创建日期等复制粘贴到每个实体中。 优点:这很容易和复制方法的作品。 缺点:失败DRY,你不能处理所有使用共享超类的实体。 (但可以为此创建一个接口。) 重写超类的值,并将它们传递给超类。 您仍然需要将覆盖值复制粘贴到每个实体中,但至少您不必复制注释。 @Entity data class Comment( @Lob comment: String, override val id: Long = -1 ) : BaseEntity(id) @MappedSuperclass abstract class BaseEntity( @Id @GeneratedValue(strategy = GenerationType.AUTO) open val id: Long = -1 ) ??? 我什至不能想到第三个选项是有效的。 还有另一种方法吗? 使ID为var,并且每次都创建一个自定义的复制方法? 这听起来很丑。

使用JPA + Kotlin收集映射错误

我试图使用这两个实体之间的多对多关系。 @Entity data class Course( @Id @GeneratedValue var id: Long = 0, var name: String, var lectures: Int, @JsonIgnore @JoinTable(name = “CourseStudent”, joinColumns = arrayOf(JoinColumn(name = “courseId”, referencedColumnName = “id”)), inverseJoinColumns = arrayOf(JoinColumn(name = “studentId”, referencedColumnName = “id”)) ) val enrolled: List = emptyList() ) @Entity data class User( @Id @GeneratedValue var id: Long = […]

Kotlin:Collection既没有genericstypes,也没有OneToMany.targetEntity()

我有一个枚举类RoleType public enum RoleType { SYSTEM_ADMIN, PROJECT_ADMIN, USER; } 在我的User实体类,我有以下映射的枚举集合。 这是Java代码: @JsonProperty @ElementCollection @Enumerated(EnumType.STRING) @CollectionTable(name = “user_role”, joinColumns = @JoinColumn(name = “user_id”)) private Set roles; 我把这个User实体类转换成Kotlin ,这里是代码: @JsonProperty @Enumerated(EnumType.STRING) @ElementCollection @CollectionTable(name = “user_role”, joinColumns = arrayOf(JoinColumn(name = “user_id”))) var roles: kotlin.collections.Set? = null 转换后,hibernate抛出以下exception: Collection has neither generic type or OneToMany.targetEntity() defined: com.abmodel.User.roles 在Java之前它工作正常。 我也尝试像这样在@ElementCollection添加targetClass […]

kotlin数据类+ beanvalidationjsr 303

我试图让Kotlin在spring-data-rest项目中使用jsr 303validation。 给定以下数据类声明: @Entity data class User( @Id @GeneratedValue(strategy = javax.persistence.GenerationType.AUTO) var id: Long? = null, @Size(min=5, max=15) val name: String ) @Size注释在这里没有任何作用,使我能够保存用户名称为1个字符。 当执行完全相同的例子,而不是在Kotlin的Java类中时,它工作的很好。 这使我想到一个Kotlin问题。 在此先感谢您的帮助!

如何在hibernate-validator中设置一个可选的/可空的属性?

我发现这个实现 ,基本上做我想要的。 @ConstraintComposition(OR) @NotBlank @Null @ReportAsSingleViolation @Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER}) @Retention(RUNTIME) @Constraint(validatedBy = {}) public @interface NullOrNotBlank { String message() default "{org.hibernate.validator.constraints.NullOrNotBlank.message}"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; } 和我一样使用它 @field:NullOrNotBlank @field:Size(max = 50) var middleName: String? = null, 我也试过了 @field:NullOrNotBlank @field:Size(max = 50) @field:Column(nullable = true) var middleName: String? […]