JPA Hibernate InheritanceType.JOINED SchemaManagementException - PullRequest
0 голосов
/ 14 января 2019

У меня есть родительский класс сущностей с двумя дочерними классами сущностей. В родительском классе есть три свойства, аннотированные @ManyToOne, и пять других свойств, аннотированных @Column.

Hibernate хочет, чтобы три свойства (страна, биржа, сектор), аннотированные @ManyToOne, присутствовали в таблицах дочерних БД (будущее и акции).

Когда эти три свойства FK отсутствуют в таблицах базы данных "future" и "stock", выдается следующее исключение: org.hibernate.tool.schema.spi.SchemaManagementException: проверка схемы: отсутствует столбец [country_id] в таблице [будущее]

Есть идеи, почему? Нужно ли повторять / добавлять столбцы внешнего ключа в таблицу дочерней БД?


@MappedSuperclass
public abstract class BaseEntity implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    protected int id;
}

Родитель: Инструмент

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name="instr_type", discriminatorType = DiscriminatorType.STRING, length = 1)
@Table(name = "instrument")

public class Instrument extends BaseEntity {              

    @Column
    private String symbol;

    @Column
    private String isin;

    @Column
    private String name;

    @Column
    @Enumerated(EnumType.STRING)
    private LiquidEnum liquid;

    @Column
    private boolean active;

    // FK

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "country_id", nullable = false, foreignKey = @ForeignKey(name = "instrument_country_fk"))
    private Country country;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "exchange_id", nullable = false, foreignKey = @ForeignKey(name = "instrument_exchange_fk"))
    private Exchange exchange;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "sector_id", nullable = true, foreignKey = @ForeignKey(name = "instrument_sector_fk"))
    private Sector sector;

    // FK end

    getter / setter
    ...
}

дочерний класс: Будущее

@Entity
@Table(name = "future")
@DiscriminatorValue("F")
@PrimaryKeyJoinColumn(name = "id")
public class Future extends Instrument {

    @Column(name = "expirationdate")
    private LocalDate expirationDate;

    public LocalDate getExpirationDate() {
        return expirationDate;
    }

    public void setExpirationdate(LocalDate expirationDate) {
        this.expirationDate = expirationDate;
    }
}

дочерний класс: сток

@Entity
@Table(name = "stock")
@DiscriminatorValue("S")
@PrimaryKeyJoinColumn(name = "id")
public class Stock extends Instrument  {

}

1 Ответ

0 голосов
/ 16 января 2019

Я нашел причину проблемы: объекты внешнего ключа (страна, биржа, сектор) ссылаются на сущность Stock вместо сущности Instrument.

Когда я реорганизовал модель db с помощью стратегии наследования (добавив родительский объект для сущности «Инструмент»), я забыл перенаправить атрибуты @OneToMany в Country, Exchange и Sector на сущность Instrument.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...