Spring Boot JPA,如果我有多个具有相同列名的表,可以放在同一个实体类中吗?

时间:2018-10-11 21:38:19

标签: spring-boot spring-data-jpa multiple-columns

我在自定义SQL语句中使用as子句,在实体类中,我使用as子句中的名称。有多个具有相同列名的表的最佳方法是什么?单独的实体类?

2 个答案:

答案 0 :(得分:1)

您可以有一个抽象类,在其中定义所有用列名注释的公共字段,并用MappedSuperclass对其进行注释。

然后,对于每个共享相同列名的不同表,您将创建一个新类,该类扩展了抽象类,并用表名对其进行注释。

这样,您就不必重复它们共有的列的定义。

@MappedSuperclass
abstract class Person {
    // Common columns

    @Id
    @Column(name = "ID")
    private Long id;

    @Column(name = "AGE")
    private Integer age;

    // getters, setters, hashCode, equals...
}

@Entity
class Employee extends Person {
    // This entity will include 'ID' and 'AGE' columns from 'Person'

    @Column(name = "SALARY")
    private BigDecimal salary;

    // getters, setters, hashCode, equals...
}

@Entity
class Student extends Person {
    // This entity will include 'ID' and 'AGE' columns from 'Person'

    @Column(name = "FIELD")
    private String field;

    // getters, setters, hashCode, equals...
}

答案 1 :(得分:0)

单实体多表注释

javax.persistence.*库具有@SecondaryTable批注,该批注可应用于可用于将单个实体映射到共享相似列的多个表的实体。但是,您需要在适用于辅助表的所有成员变量之上包括一个@Column注释。下面是一个示例

示例实体

@Entity
@Table(name = "dealers")
@SecondaryTable(name = "dealers_tmp")
public class Dealer {

    @Id
    @Column(name = "id", table="dealers_tmp")
    private long id;

    @Column(name = "account", table="dealers_tmp")
    private String account;

    @Column(name = "name", table="dealers_tmp")
    private String name;
}

在上面的示例中,按照惯例,第一个表(经销商)已经适用于所有没有注释的列。但是,您确实需要在所有应用程序变量中包括table="<secondary>"