Хотя я не очень знаком с приложениями для покупок, но когда я думаю об этом, мне приходят в голову следующие моменты:
Должна быть другая концепция для проданного товара / продукта, чем предмет / продукт. Потому что «концепция продукта» должна быть независимой от «того, что можно сделать с продуктом». Например, продажа товара - это не то же самое понятие, что и сам товар. Поэтому у вас может быть другой класс, например orderItem.
class product {
Long productId
String productName
...
}
class orderItem{
Product soldProduct;
Invoice itsInvoice;
public Invoice getItsInvoice();
}
class Invoice {
Long invoiceNumber;
List<OrderItem> orderItem;
}
Если вы сделаете это, то каждый элемент заказа принадлежит только одному счету, в то время как счет может иметь много элементов заказа. Следовательно, между ivoice и позицией заказа существует взаимно-однозначное отношение, а между oreritem и продуктом - взаимно-однозначное отношение.
Даже если вы все еще делаете это только с двумя сущностями, счет-фактура и продукт, что подразумевает, что вы объединяете понятия «продукт» и «продающий продукт» в одну сущность, все же связь между счетом-фактурой и продуктом является однозначной. -Много не много ко многим. Потому что отношения между ними через "продажу продукта". В этом случае «проданный товар» принадлежит только одному счету.
Но первый подход кажется мне лучше.