如何处理与抽象超类没有区别且不需要表的类

时间:2013-04-23 16:37:48

标签: eclipse inheritance jpa eclipselink

我有一些与抽象超类没有什么不同的类,因此不需要自己的表。我正在使用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超类表中的实体持久化,并将标有“ExpensesTask”的DTYPE列作为鉴别值。

所以它似乎有效,尽管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投诉)我不确定这是否有点像“软糖”。

1 个答案:

答案 0 :(得分:0)

将表设置为子类中的超类'表是当前在EclipseLink中执行此操作的支持方式,并且确实有效。 (从技术上讲,JPA不允许类在JOINED继承中没有表,但EclipseLink不允许)。

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