带有抽象字段的库中的@MappedSuperclass。将具体Impl绑定到抽象字段

时间:2019-05-31 14:54:21

标签: java spring hibernate jpa

在我的项目中,我有以下情形:

库代码:

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

}

我们将HibernateSpring 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类型。关于方法或模型的方式有何建议?这里的问题是库代码不会知道要绑定到的应用程序特定实现。应用程序应该提供类型,或者可能有一种方法可以在应用程序启动时更改绑定。不确定...:)

还尝试了hbmannotation的组合。但无法正常运作。

0 个答案:

没有答案