【发布时间】:2018-10-22 23:58:16
【问题描述】:
我已经对该主题进行了一些研究,但我要么发现了非常老的帖子,要么发现了不完全是我想要实现的问题。我已经使用 Hibernate 多年了,我认为自己精通它。我之前在持久层中使用继承将具有不同类型订单的订单表示为子类(对于医院系统),效果很好。
我正在开发一个针对商店的新项目,我遇到了一个我不确定 Hibernate 是否可以解决的问题。基本上,我允许用户构造 Bill 对象,其中包含您在账单中所期望的信息:客户姓名、账单编号、总金额、税金等。每个 Bill 对象包含一组 OrderedProduct 对象,这些对象又包含一个 Product 对象和一个数量。仅此要求,我的项目实际上已经完成,一切正常。
我的客户现在要求添加我不知道如何解决的问题。我被要求允许构建 Kit 对象,这些对象不过是一组 Product 对象,两者都有价格,以便为经常一起购买的某些东西提供折扣。小菜一碟,我构建了一个 GUI 来构建和持久化这些对象,但我现在有一个问题:如何将这些 Kit 对象连接到 Bill?我的 OrderedProduct 对象目前与 Product 对象绑定,这个模型显然不符合这个新要求。
我不能使用继承(据我所知),因为套件基本上只是一个降价的产品列表。如果这两个类都继承自一个共同的抽象类,那么一个类怎么能包含另一个类呢?
我开始构建它的方式是使用 Billable 接口。允许选择产品/套件的下拉菜单使用以下代码填充自身:
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;
}
这允许一个下拉列表包含两种类型的实体,同时对用户完全无缝。在我意识到:你不能将实体类的属性作为接口类型(再次,据我所知)。
抱歉,解释太长了,我希望我想要做的事情很清楚。我可以为此想到一些(不太理想的)解决方法,但如果有人知道如何设计这个模型,我会很高兴听到它!
谢谢
【问题讨论】:
-
我最终向我的 BilledProduct 实体添加了一个 Kit 属性。用于创建 Bill 对象的 GUI 将始终显示一个空字段,具体取决于订购的是 Kit 还是 Product 对象,但我能够使最终账单对这一事实完全透明。现在一切实际上都运行良好,但我不得不改进相当多的代码,因为它之前总是期待一个 Product 对象,现在它有时为空。不过,我想知道是否有更优雅的方式来做到这一点。
标签: java hibernate interface attributes persist