JPA继承策略JOINED:无法访问超类属性

JPA inheritance strategy JOINED: Connot access superclass attributes

我正在做一个项目,我必须实现一个 class 层次结构。例如,典型的 Person 层次结构。

我有一个抽象的超级class Person 和它的子classes Student.

超级class :

@Builder
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@Table(
       name = "persons"
       uniqueConstraints = {
                @UniqueConstraint(name = "persons_name_unique", columnNames = "name")
        })
public abstract class Person extends AbstractPersistable<Long>{
    @Getter
    private String name;
    @Getter
    private int age;
    
    // ...
}

亚class 学生:

@Builder
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Entity
@Table(name = "students")
public class Student extends Person {
    @Getter
    private int grade;

    // ...
}

问题:

我的问题是在使用 .builder().

时无法访问 superclass 的属性
Student student =
         Student.builder()
                .name("UniqueName") //CompilerError(Cannot resolve method 'name' in 'StudentBuilder')
                .age(19)
                .grade(2)
                .build();

但是,当我从 superclass Person 中删除 @Builder 时,我只能访问 superclass 和 none 的属性子class。 当我从 subclass 中移除 @Builder 并将其保留在 superclass 中时,情况正好相反。

我的问题是我做错了什么 - 我相信这是因为 @Builder 注释,@Builder

的正确表示是什么

提前致谢!

@SuperBuilder 注释父项和子项 class 应该是使所有属性可用的一种方法:

你有两个选择。要么创建调用父构造函数的构建器构造函数,例如:

@Builder
public Student(String name, int age, int grade) {
    super(name, age);
    this.grade = grade;
}

在你的学生中(并删除 class 级别的@Builder)。您还需要至少将 Person @AllArgsConstructor 的可见性扩展到受保护。参见 this

另一种选择是使用 Lombok @SuperBuilder(包实验性但似乎有效)。只需将 class 中的 @Builder 替换为 @SuperBuilder.