我有一些与抽象超类没有真正区别的类,因此不需要它们自己的表。我正在使用 Spring Roo。
我有一个 Task 超类映射到一个 Task 表,并且正在使用 Inheritance.Joined 继承模型。
import java.math.BigDecimal;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.Table;
privileged aspect Task_Roo_Jpa_Entity {
declare @type: Task: @Entity;
declare @type: Task: @Table(schema = "ADMIN_DIRECT", name = "TASK");
declare @type: Task: @Inheritance(strategy = InheritanceType.JOINED);
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "ID")
private BigDecimal Task.id;
public BigDecimal Task.getId() {
return this.id;
}
public void Task.setId(BigDecimal id) {
this.id = id;
}
}
我有一些与抽象超类没有区别的子类,因此不需要数据库中的专用表,而另一些与超类不同,因此有专用表。
我可以通过在与抽象类没有区别的子类中执行此操作来获得持久性。即创建一个扩展任务的子类并注释如下(注意表名TASK实际上是超类表):
@Entity
@Table(schema = "ADMIN_DIRECT", name = "TASK")
public class ExpensesTask extends Task {
}
这会在 TASK 超类表中保留一个实体,其中一个 DTYPE 列标记为“ExpensesTask”作为鉴别器值。
所以它似乎可以工作,尽管 Eclipse 提出了错误说明
ExpensesTask" is mapped, but is not included in any persistence unit ... JPA Problem
如果我让 Roo 像我在“适当的”任务子类中所做的那样接管,那么持久性似乎会经历这些动作,然后默默地失败(没有任何持久性,没有引发错误):
即这不起作用
@RooJavaBean
@RooToString
@RooDbManaged(automaticallyDelete = true)
@RooJpaActiveRecord(versionField = "", table = "TASK", schema = "ADMIN_DIRECT")
public class ExpensesTask extends Task {
}
import javax.persistence.Entity;
import javax.persistence.Table;
privileged aspect ExpensesTask_Roo_Jpa_Entity {
declare @type: ExpensesTask: @Entity;
declare @type: ExpensesTask: @Table(schema = "ADMIN_DIRECT", name = "TASK");
}
当不需要区分子类和抽象超类时,有兴趣知道映射这种继承情况的正确方法。
我总是可以创建一个“ExpensesTask”表,其中只有一个“ID”字段,因此 Roo 方法适用于我的其他“带表的子类”类,但因为我有一个工作版本(尽管有一些 Eclipse 投诉)我不确定这是否有点“软糖”。