В моем проекте есть следующий сценарий:
Код библиотеки:
@MappedSuperclass
public abstract class AbstractMultiProductTable extends AbstractTable {
@NotNull
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "product_id", nullable = false, updatable = false)
private AbstractProductTable product;
// getter and setters for product
}
@MappedSuperclass
public abstract AbstractProductTable extends AbstractTable {
}
Код приложения (с использованием библиотеки)
@Entity
@Table("product")
public class Product extends AbstractProductTable {
}
@Entity
@Table("order")
public class Order extends AbstractMultiProductTable {
}
Мы используем Hibernate
с Spring JPA
.Hibernate жалуется на то, что AbstractProductEntity
следует заменить на конкретную реализацию в AbstractMultiProductTable
, что ожидается.
Я пробовал следующий сценарий, который работает, но хочу более элегантный и менее изменяющий код подход
Подход, который работает:
Код библиотеки:
@MappedSuperclass
public abstract class AbstractMultiProductTable<T extends AbstractProductTable> extends AbstractTable {
@NotNull
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "product_id", nullable = false, updatable = false)
private T product;
// getter and setters for product
}
Код приложения (с использованием библиотеки)
@Entity
@Table("order")
public class Order extends AbstractMultiProductTable<Product> {
}
Это включает добавление типа Product
для каждой сущностиэто расширяется AbstractMultiProductTable
.Любые предложения о подходе или способах, которыми модели могут быть?Проблема здесь в том, что код библиотеки не будет знать о конкретной реализации приложения для привязки.Либо приложение должно предоставлять тип, либо может быть способ изменить привязку при запуске приложения.не уверен ...:)
Также пробовал, комбинацию hbm
и annotation
.но не смог заставить его работать.