Hibernate - 具有接口属性的实体 class

Hibernate - Entity class having an attribute that is an interface

我已经对这个主题进行了一些研究,但我不是在寻找真正的旧帖子,就是在寻找与我想要实现的目标不完全相同的问题。我已经使用 Hibernate 多年,我认为自己精通它。我之前在我的持久层中使用继承来表示具有不同类型订单的订单作为子 classes(对于医院系统)取得了很好的效果。

我正在为一家商店开发一个新项目,我遇到了一个问题,我不确定 Hibernate 是否可以解决。基本上,我允许用户构建 Bill 对象,其中包含您希望在账单中包含的信息:客户姓名、账单编号、总金额、税金等。每个 Bill 对象都包含一组 OrderedProduct 对象,而这些对象又包含一个 Product 对象和一个数量。只有这个要求,我的项目实际上已经完成并且一切正常。

我的客户现在要求添加,我不确定如何处理。我被要求允许构建 Kit 对象,这些对象只是一组 Product 对象,两者都有一个价格,以便对经常一起购买的某些东西提供折扣。小菜一碟,我构建了一个 GUI 来构建和保存这些对象,但我现在遇到了一个问题:如何将这些 Kit 对象连接到 Bill 中?我的 OrderedProduct 对象当前绑定到一个 Product 对象,这个模型显然不符合这个新要求。

我不能使用继承(据我所知),因为套件基本上只是一系列降价的产品。如果这两个 class 都是从一个共同的抽象 class 继承的,那么一个如何包含另一个的集合?

我开始构建它的方式是使用 Billable 接口。允许 product/kit 选择的下拉菜单使用以下代码来填充自身:

items = FXCollections.observableArrayList(productService.findAllInInventory());

@Override
public List<Billable> findAllInInventory() 
{
    List<Product> products = findProductsInInventory();
    List<Kit> kits = findKitsInInventory();

    List<Billable> billables = new ArrayList<>();

    billables.addAll(products);
    billables.addAll(kits);

    return billables;
}

这允许一个下拉列表包含两种类型的实体,同时对用户来说是完全无缝的。在我意识到:你不能让实体的属性 class 成为接口类型(再次,据我所知)。

抱歉解释得太长了,我希望我想做的是清楚的。我可以想到一些(不太理想的)解决方法,但如果有人知道如何设计这个模型,我会很高兴听到它!

谢谢

结论是,实体 class 的持久化 属性 不能是接口类型。如果您的设计最终需要这样的结构,您将(现在)必须 re-structure 东西。