1

我有一些与抽象超类没有真正区别的类,因此不需要它们自己的表。我正在使用 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 投诉)我不确定这是否有点“软糖”。

4

1 回答 1

0

将表设置为子类中的超类表是 EclipseLink 中当前支持这样做的方式,并且确实有效。(从技术上讲,JPA 不允许类在 JOINED 继承中没有表,但 EclipseLink 可以)。

完成同样事情的另一种方法是让它默认一个表并使用 DescriptorCustomizer 清除描述符的表以摆脱它。

于 2013-04-24T15:17:17.813 回答