JPA:是否可以在自己的表中保存派生类,其中引用的字段是MappedSuperclass?

时间:2012-04-10 17:45:09

标签: hibernate ejb jpa-2.0

是否可以执行以下操作...

我有一个名为Action的MappedSuperclass:

@MappedSuperclass
public class Action extends EntityBase
{
    private static final long serialVersionUID = 2604473746836781718L;

    private String event;

    public String getEvent()
    {
        return event;
    }

    public void setEvent(String event)
    {
        this.event = event;
    }
}

此外,我有2个类(实体)派生自此类,例如GenericAction:

@Entity
@Table(name = "GENERIC_ACTION")
@AttributeOverrides({@AttributeOverride(name = "id", column = @Column(name = "GAC_ID")),
        @AttributeOverride(name = "version", column = @Column(name = "GAC_VERSION")), @AttributeOverride(name = "event", column = @Column(name = "GAC_EVENT"))})
public class GenericAction extends Action
{
    private static final long serialVersionUID = 2694061082912048881L;

    @Column(name = "GAC_PAYLOAD")
    private String payload;

    public String getPayload()
    {
        return payload;
    }

    public void setPayload(String payload)
    {
        this.payload = payload;
    }
}

在另一个名为Journal的实体中,有一个Action属性集:

@Entity
@Table(name = "JOURNAL")
@AttributeOverrides({@AttributeOverride(name = "id", column = @Column(name = "JRN_ID")),
        @AttributeOverride(name = "version", column = @Column(name = "JRN_VERSION"))})
public class Journal extends EntityBase
{
    private static final long serialVersionUID = 2525323851057436815L;

    @Column(name = "JRN_ACTION")
    private Action action;
}

在我的代码中我实例GenericAction并使用Journal的setter设置它。当Journal将被持久化时,它应该将GenericAction的内容保存在自己的表中,但这不会发生。它将GenericAction的字节代码保存到Journal的Action字段中。

这有可能吗?

1 个答案:

答案 0 :(得分:1)

如果我的问题正确,你可能会考虑以下

@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)

默认继承startegy是SINGLE_TABLE。至少JPA规范说明了这一点。我很确定Hibernate在这个

中遵循JPA规范

看看这里

http://docs.jboss.org/ejb3/app-server/HibernateAnnotations/reference/en/html_single/index.html

我省略了一件事: 你必须在你的动作属性上放置@OneToOne或@ManyToOne annotaton,这样你才能加入实体,否则它只是序列化动作属性