JPA TABLE_PER_CLASS Наследование: создана таблица абстрактных сущностей

Я создал 3 класса сущностей с именами NodeBase, NodeDocument и NodeFolder.

И с использованием состояния наследования таблиц по классам и, как определено в таблице по наследованию классов, таблица определяется для каждого конкретного класса в иерархии наследования, в этом случае NodeBase является абстрактной сущностью, но таблица этой сущности создается с именем NODEBASE.

Схема взаимосвязи сущностей

@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?

введите описание изображения здесь


person jGauravGupta    schedule 26.06.2015    source источник
comment
Возможно, указание вашей реализации JPA может помочь, потому что наличие таблицы для аннотации не имеет смысла с этой стратегией.   -  person Neil Stockton    schedule 26.06.2015
comment
Использование реализации Eclipselink JPA.   -  person jGauravGupta    schedule 26.06.2015


Ответы (2)


Сообщается, что ссылка на eclipse делает это, по крайней мере, в более ранних версиях некоторые люди говорят, что это ошибка, а может быть, и нет, просто таблица, созданная eclipselink для объединения всех таблиц наследования.

Если родительский класс является абстрактным, вы можете использовать @MappedSupperclass вместо аннотации @Entity, чтобы избежать создания таблицы, если вы не запрашиваете абстрактный класс

person Ismael_Diaz    schedule 26.06.2015

@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;

}

Теперь это работает. Смирись с этим.

person amit kumar    schedule 02.09.2019