Я немного исследовал эту тему и нахожу либо действительно старые сообщения, либо вопросы, которые не совсем то, чего я пытаюсь достичь.Я использую Hibernate уже много лет и считаю, что хорошо разбираюсь в этом.Я использовал наследование в своем слое персистентности прежде, чтобы представлять заказы с различными типами заказов в качестве дочерних классов (для больничной системы) с отличными результатами.
Я работаю над новым проектом для магазина, и я столкнулся с проблемой, которую я не уверен, может ли Hibernate решить.По сути, я позволяю пользователю создавать объекты Bill, содержащие информацию, которую вы ожидаете получить в счете: имя клиента, номер счета, общая сумма, налоги и тому подобное.Каждый объект Bill содержит набор объектов OrderedProduct, которые, в свою очередь, содержат объект Product и количество.Только с этим требованием мой проект фактически завершен, и все отлично работает.
Мой заказчик сейчас просит о добавлении, которое я не знаю, как решить.Меня просят разрешить создание объектов Kit, которые представляют собой не что иное, как набор объектов Product с ценой для обоих, чтобы предлагать скидки на определенные вещи, которые часто покупаются вместе.Пирог, я построил графический интерфейс для создания и сохранения этих объектов, но теперь у меня есть проблема: как мне связать эти объекты Kit в Билл?Мои объекты 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;
}
Это позволяет одному раскрывающемуся списку содержать объекты обоих типов, при этом оставаясь полностью незаметным для пользователя.Я довольно далеко адаптировался к адаптации остальной части GUI создания счета с этой концепцией, пока не понял: у вас не может быть атрибута класса сущности как типа интерфейса (опять же, насколько мне известно).
Извините за длинное объяснение, и я надеюсь, что то, что я пытаюсь сделать, ясно.Я могу придумать некоторые (менее чем идеальные) обходные пути для этого, но если у кого-то есть идея, как разработать эту модель, я с удовольствием ее услышу!
Спасибо