Spring - JPA 在摘要 class 中加入摘要 class
Spring - JPA join abstract class in abstract class
我对 JPA 继承有疑问。数据库模型也是专门搭建的。它包含几个具有相同属性的 table(table 被国家故意删减)并且所有这些 table 连接到另一个 table (OneToOne)。
这是数据模型的示例:
usa_user、germany_user、austria_user。所有这些 table 都具有相同的属性(id、名称、地址)。现在地址也是根据国家建立的,例如usa_address, germany_address, austria_address.
现在我不知道或有问题,我已经正确映射了很长时间。我有以下内容:
// All Lombok Getter, Setter Args,...
@MappedSuperclass
public abstract Address {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@JsonIgnore
private Long id;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "user_id", referencedColumnName = "id")
@JsonIgnore
private User user;
private String name;
private String addr_num;
...
}
// All Lombok Getter, Setter Args,...
@MappedSuperclass
public abstract User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@JsonIgnore
private Long id;
@OneToOne(mappedBy = "user", cascade = CascadeType.ALL, fetch = FetchType.LAZY, optional = false)
@JsonIgnore
private Address address;
private String name;
}
@Entity
@Table(name = "usa_user")
public class UsaUser extends User {}
@Entity
@Table(name = "austria_user")
public class AustriaUser extends User {}
@Entity
@Table(name = "germany_user")
public class GermanyUser extends User {}
@Entity
@Table(name = "usa_address")
public class UsaAddress extends Address {}
@Entity
@Table(name = "austria_address")
public class AustriaAddress extends Address {}
@Entity
@Table(name = "germany_address")
public class GermanyAddress extends Address {}
但不幸的是,这不起作用。每次我启动它时,JPA 都会注意到它无法映射实体地址 - 用户(这是可以理解的,因为它们不是实体而是抽象 类)。解决这个问题的最佳方法是什么?我想避免我必须列出所有这些实体中的属性,因为这会是多余的。
目标是找出如何在 @MappedSuperclass
中使用 @MappedSuperclass
。
MappedSuperclass 不可查询,因此也不可加入。您需要使用 table per class 继承策略将其映射为抽象实体。只需在地址和用户上切换到 @Entity
并添加 @Inheritance(TABLE_PER_CLASS)
.
我对 JPA 继承有疑问。数据库模型也是专门搭建的。它包含几个具有相同属性的 table(table 被国家故意删减)并且所有这些 table 连接到另一个 table (OneToOne)。
这是数据模型的示例: usa_user、germany_user、austria_user。所有这些 table 都具有相同的属性(id、名称、地址)。现在地址也是根据国家建立的,例如usa_address, germany_address, austria_address.
现在我不知道或有问题,我已经正确映射了很长时间。我有以下内容:
// All Lombok Getter, Setter Args,...
@MappedSuperclass
public abstract Address {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@JsonIgnore
private Long id;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "user_id", referencedColumnName = "id")
@JsonIgnore
private User user;
private String name;
private String addr_num;
...
}
// All Lombok Getter, Setter Args,...
@MappedSuperclass
public abstract User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@JsonIgnore
private Long id;
@OneToOne(mappedBy = "user", cascade = CascadeType.ALL, fetch = FetchType.LAZY, optional = false)
@JsonIgnore
private Address address;
private String name;
}
@Entity
@Table(name = "usa_user")
public class UsaUser extends User {}
@Entity
@Table(name = "austria_user")
public class AustriaUser extends User {}
@Entity
@Table(name = "germany_user")
public class GermanyUser extends User {}
@Entity
@Table(name = "usa_address")
public class UsaAddress extends Address {}
@Entity
@Table(name = "austria_address")
public class AustriaAddress extends Address {}
@Entity
@Table(name = "germany_address")
public class GermanyAddress extends Address {}
但不幸的是,这不起作用。每次我启动它时,JPA 都会注意到它无法映射实体地址 - 用户(这是可以理解的,因为它们不是实体而是抽象 类)。解决这个问题的最佳方法是什么?我想避免我必须列出所有这些实体中的属性,因为这会是多余的。
目标是找出如何在 @MappedSuperclass
中使用 @MappedSuperclass
。
MappedSuperclass 不可查询,因此也不可加入。您需要使用 table per class 继承策略将其映射为抽象实体。只需在地址和用户上切换到 @Entity
并添加 @Inheritance(TABLE_PER_CLASS)
.