JPA TABLE_PER_CLASS继承:创建的抽象实体表

时间:2015-06-26 06:45:39

标签: java entity-framework jpa persistence jpa-2.1

我创建了3个名为NodeBaseNodeDocumentNodeFolder的实体类。

使用Table Per Class Inheritance stategy并按照每个类继承的表中的定义,为继承层次结构中的每个具体类定义一个表,在这种情况下,NodeBase是抽象实体,但是这个表是创建实体命名为 NODEBASE

Entity relationship diagram

@Entity
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public abstract class NodeBase implements Serializable {

    @Column(name="NBS_UUID")
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Long uuid;

    @Column(name="NBS_NAME")
    @Basic
    private String name;

    @ManyToOne(targetEntity = NodeFolder.class)
    private NodeFolder parent;

}


@Entity
@Table(name="SDM_NODE_DOCUMENT")
public class NodeDocument extends NodeBase implements Serializable {

    @Column(name="NDC_MIMETYPE")
    @Basic
    private String mimeType;

}

@Entity
@Table(name="SDM_NODE_FOLDER")
public class NodeFolder extends NodeBase implements Serializable {

    @OneToMany(targetEntity = NodeBase.class,mappedBy = "parent")
    private Collection<NodeBase> children;
}

如何创建实体类,只需要创建两个名为 SDM_NODE_DOCUMENT SDM_NODE_FOLDER 的表?

enter image description here

2 个答案:

答案 0 :(得分:0)

据报道,eclipse链接是这样做的,至少在早期版本中,有些人说它是一个bug,或者可能不是,只是一个由eclipselink生成的表,用于继承所有表的联合。

如果父类是抽象的,你可以使用@MappedSupperclass而不是@Entity anotation来避免在你没有查询抽象类的情况下创建表

答案 1 :(得分:0)

@MappedSuperclass
public abstract class NodeBase implements Serializable {

    @Column(name="NBS_UUID")
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Long uuid;

    @Column(name="NBS_NAME")
    @Basic
    private String name;

    @ManyToOne(targetEntity = NodeFolder.class)
    private NodeFolder parent;

}

现在可以使用了。随它去吧。