我目前正在尝试通过jdbc连接构建完整的Spring Boot Rest服务。
目前,我正在努力解决有关休眠和存储实体的一个小问题。
我只有一个基类:
@Entity
@Table
public abstract class Person {
private int id;
private String firstName;
private String middleName;
private String lastName;
@Id
@GeneratedValue(generator = "increment")
@GenericGenerator(name = "increment", strategy = "increment")
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Column
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
@Column
public String getMiddleName() {
return middleName;
}
public void setMiddleName(String middleName) {
this.middleName = middleName;
}
@Column
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
}
和2个子类:
@Entity
@Table
public class Member extends Person{
private String memberNumber;
@Column
public String getMemberNumber() {
return memberNumber;
}
public void setMemberNumber(String memberNumber) {
this.memberNumber = memberNumber;
}
}
和
@Entity
@Table
public class Supporter extends Person {
private String supporterNumber;
@Column
public String getSupporterNumber() {
return supporterNumber;
}
public void setSupporterNumber(String supporterNumber) {
this.supporterNumber = supporterNumber;
}
}
基类是抽象的,因为我想避免在不指定成员或支持者的情况下创建该实例。但是在数据库方案中,由于标准化,我仍然希望有3个表。
现在应该使用哪个注释才能达到此目标?现在如何将一行成员或支持者链接到该成员?我真的很困惑。
谢谢!
答案 0 :(得分:1)
从类到表的映射是由休眠完成的。由于关系数据库表和Java对象是种不同的ORM映射器,因此在它们之间进行映射的策略也有所不同。
休眠可以使用以下策略:
您可以从official documentation中了解有关它们的更多信息。
它们有不同的优缺点,通常使用默认值是最安全的。但是,默认策略仅使用一个表,因此您需要切换到另一种策略。
每个类的表将创建三个表。您还可以查看MappedSuperclass和Joined Table的示例,它们还将使用多个表。
摘自官方文档:
@Entity(name = "Account")
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public static class Account {
@Id
private Long id;
private String owner;
private BigDecimal balance;
private BigDecimal interestRate;
//Getters and setters are omitted for brevity
}
@Entity(name = "DebitAccount")
public static class DebitAccount extends Account {
private BigDecimal overdraftFee;
//Getters and setters are omitted for brevity
}
@Entity(name = "CreditAccount")
public static class CreditAccount extends Account {
private BigDecimal creditLimit;
//Getters and setters are omitted for brevity
}
将创建这些表:
CREATE TABLE Account (
id BIGINT NOT NULL ,
balance NUMERIC(19, 2) ,
interestRate NUMERIC(19, 2) ,
owner VARCHAR(255) ,
PRIMARY KEY ( id )
)
CREATE TABLE CreditAccount (
id BIGINT NOT NULL ,
balance NUMERIC(19, 2) ,
interestRate NUMERIC(19, 2) ,
owner VARCHAR(255) ,
creditLimit NUMERIC(19, 2) ,
PRIMARY KEY ( id )
)
CREATE TABLE DebitAccount (
id BIGINT NOT NULL ,
balance NUMERIC(19, 2) ,
interestRate NUMERIC(19, 2) ,
owner VARCHAR(255) ,
overdraftFee NUMERIC(19, 2) ,
PRIMARY KEY ( id )
)