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 应该是使所有属性可用的一种方法:
- https://projectlombok.org/features/experimental/SuperBuilder
- Lombok @builder on a class that extends another 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
.
我正在做一个项目,我必须实现一个 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()
.
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 应该是使所有属性可用的一种方法:
- https://projectlombok.org/features/experimental/SuperBuilder
- Lombok @builder on a class that extends another 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
.