jpa Javax-Persistance:实体没有使用Java记录的主键

9nvpjoqh  于 2023-10-19  发布在  Java
关注(0)|答案(3)|浏览(102)

我试图使用Java记录创建一个实体类,但我得到错误消息“实体没有主键”,尽管我分配了一个ID注解。

import javax.persistence.*;
    import java.time.LocalDate;

    @Entity
    public record Agent (
            @Id
            String code,
            String name,
            LocalDate date,
            String workingArea,
            String country,
            String phoneNumber,
            boolean licenseToKill,
            int credits,
            byte[] picture)
          {}

这有什么问题吗

vu8f3i0k

vu8f3i0k1#

record不能用作Hibernate实体,因为它违反了JPA规范对实体的要求。将其设置为class,并使用@Immutable注解:

@Entity
@Immutable
public class Agent
o7jaxewo

o7jaxewo2#

只是为了完整性而清除答案(尽管@Turning85和@gkatiforis已经提供了正确的解释):
根据JPA规范,实体必须遵循以下要求:

  • 实体类需要是非final的,
  • 实体类需要有一个public或protected的无参数构造函数,
  • 实体属性必须是非final的。

然而,正如article所解释的那样,Java Record类型是这样定义的:

  • 关联的Java类是final,
  • 只有一个构造函数接受所有属性,
  • Java记录属性是final。

但是记录非常适合DTO投影,DTO投影通常用作存储在数据库中的数据的只读表示。更多信息-https://thorben-janssen.com/java-records-hibernate-jpa/

vof42yt1

vof42yt13#

Entity类内部使用setter方法来设置数据。因为记录是不可变的。它只包含

  • 领域
  • 全参数构造器
  • getters
  • toString
  • equals/hashCode方法

而不是setter方法。所以我们不能使用record作为实体。

相关问题