我在自定义SQL语句中使用as子句,在实体类中,我使用as子句中的名称。有多个具有相同列名的表的最佳方法是什么?单独的实体类?
答案 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>"
。