如何在JPA中重新定义继承类中的属性

时间:2011-08-17 09:43:40

标签: java jpa eclipselink

我有一个通用的数据库结构,可以存储多个用户定义的记录。例如,主表是RECORD,列是STRING01,STRING02,[...],NUM01,NUM02等。

我知道这有点奇怪,但它既有优点也有缺点。但是,这种结构存在且无法改变。现在我想创建一些JPA类。

首先,我创建了一个抽象类RECORD,如下所示(注释放在getters上,这个例子只是简化了):

@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="TYPE", discriminatorType=DiscriminatorType.STRING)
public abstract class Record {
    @Id
    private long id;

    @Column(name="STRING01")
    private String string01;

    @Column(name="STRING02")
    private String string02;

    @Column(name="NUM01")
    private BigDecimal num01;
}

然后,我创建了从RECORD继承的特定类:

@Entity
@DiscriminatorValue("Person")
public class Person extends Record {
    @Transient
    public String getFirstName() {
        return getString01();
    }

    public void setFirstName(String name) {
        setString01(name);
    }

    @Transient
    public BigDecimal getWeight() {
        return getNum01();
    }

    public void setWeight(BigDecimal weight) {
        setNum01(weight);
    }
}

这样可以正常工作,因为我可以查询RECORD以获取PERSON的主键(通过EntityManager.find())并获得结果作为PERSON的实例。我可以查询FirstName和Weight,而不必知道通用列名。

但是,如果我像SELECT p FROM Person p WHERE p.firstName = 'Michael'那样编写自己的JPA查询,则会失败。 firstName是暂时的,在这里我必须使用通用名称string01

在JPA中是否有某种方法可以覆盖基类的属性名称?也许有供应商特定的解决方案(我正在使用EclipseLink)?

1 个答案:

答案 0 :(得分:0)

您可以尝试将多个属性映射到同一列。 然后,使用@Column( name = "column name", insertable = false, updatable = false, nullable = false )注释附加属性。

或者,您可以替换/增强JPQL解析程序,以便在内部将p.firstName映射到p.string01,但这将是EclipseLink特定的,我真的不知道这是否均匀可能。把它作为一个暗示要寻找的东西。

相关问题