如何使用JPA2.0将属性作为Class和Id映射到DB中

时间:2013-01-26 09:57:30

标签: java jpa jpa-2.0

我有一个模型,每个类都扩展了实体:

@MappedSuperclass
public abstract class Entity implements Serializable {
    private Long id;
    .
    .
    .
}

现在,在我的模型中,每个实体都可以有一个属性:

@javax.persistence.Entity
public class Attribute extends Entity {
    private Entity entity;
    private String name;
    private String value;
    .
    .
    .
}

我的问题是:如何映射类Attribute的实体属性?我的想法是将此属性存储为entityClass和entityId,但我仍然不知道如何使用JPA实现此目的?


扩展实体的具体类的示例:

@javax.persistence.Entity
public class Ball extends Entity {
    private Set<Attribute> attributes;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "entity")
    public Set<Attribute> getAttributes() {
        return attributes;
    }

    public void setAttributes(Set<Attribute> attributes) {
        this.attributes = attributes;
    }
}

2 个答案:

答案 0 :(得分:1)

在JPA中没有简单的方法可以做到这一点。您可以将关系映射为@Transient,并为id和类添加两个@Basic映射(可能使用属性get / set方法)。然后在模型代码中执行查询。

如果您使用的是EclipseLink,则可以使用@VariableOneToOne,

请参阅,

http://www.eclipse.org/eclipselink/documentation/2.4/jpa/extensions/a_variableonetoone.htm#CHDDFDGF

答案 1 :(得分:0)

根据您的评论,您需要在映射的超类中建立双向关系。不幸的是,你不能在JPA中这样做。原因是MappedSuperClass不是实体,MappedSuperClass的字段属于不同的子类。

来源JPA 2.0 Specs(2.11.2)

(我不知道你想做什么但是:) 看来你正试图坚持你的持久模型的元模型。如果您需要阅读它:您可以使用EntityManagerFactory.getMetamodel()