您将如何在以下示例代码中配置注释?我只想保留JPA注释,避免使用Hibernate特定的依赖项。 下面的代码正确吗?
@Entity public class RefExample extends RefData { }
(这些类将具有多个版本,RefSomeOtherExample等,并且每个类一个db表。有些可能会添加其他字段(列),但大多数只会使用继承自“ RefData”基类的基本字段。)
基类:
@Entity public abstract class RefData { private long id; private String code; private String desc; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(unique = true, nullable = false) public long getId() { return id; } public void setId(long id) { this.id = id; } @Column(unique = true, nullable = false, length=8) public String getCode() { return code; } public void setCode(String code) { this.code = code; } @Column(unique = true, nullable = false, length=80) public String getDesc() { return desc; } public void setDesc(String desc) { this.desc = desc; } }
最终,我想使用Hibernate的SchemaExport类从中生成模式创建脚本。在上述情况下,这两个类仅应导致创建一个名为“ RefExample”的表,其中包含“ RefData”中的三列。这样行吗?
根据JPA 1.0规范:
抽象类和具体类都可以是实体。 抽象类和具体类均可使用Entity批注进行批注 ,映射为实体,并作为实体进行查询。 实体可以扩展非实体类,非实体类可以扩展实体类 。
抽象类和具体类都可以是实体。 抽象类和具体类均可使用Entity批注进行批注 ,映射为实体,并作为实体进行查询。
实体可以扩展非实体类,非实体类可以扩展实体类 。
如果需要单个表,则应使用“ 单个表”继承。
只需定义一个鉴别符列,如下所示:
@Entity @DiscriminatorColumn(name="REF_TYPE") public abstract class RefData {
但是,如果您不想依赖JPA继承策略,则可以改用MappedSuperclass:
@MappedSuperclass public abstract class RefData {
JPA规范
实体可以从提供持久实体状态和映射信息的超类继承,但它本身不是实体。通常,这种映射超类 的目的 是定义多个实体类共有的状态和映射信息 。
请记住, 您不能同时 使用@Entity和@MappedSuperclass。