У меня есть родительский класс сущностей с двумя дочерними классами сущностей. В родительском классе есть три свойства, аннотированные @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 {
}