Q 1), Как мы можем смоделировать троичное использование отношений, в спящем режиме? Например, как мы можем смоделировать троичные отношения, представленные, сюда использование В спящем режиме (или JPA)?
Примечание: Я знаю, что JPA 2 добавил некоторые конструкции для создания троичных отношений с помощью карт. Однако этот вопрос принимает JPA 1, или Будьте в спящем режиме 3.3.x, и мне не нравится использовать карты для моделирования этого.
(источник: grussell.org)
(источник: grussell.org)
Идеально я предпочитаю, чтобы моя модель была похожа на это:
class SaleAssistant {
Long id;
//...
}
class Customer {
Long id;
//...
}
class Product {
Long id;
//...
}
class Sale {
SalesAssistant soldBy;
Customer buyer;
Product product;
//...
}
Q 1.1)
Как мы можем смоделировать это изменение, в котором каждый объект Sale мог бы иметь много продуктов?
class SaleAssistant {
Long id;
//...
}
class Customer {
Long id;
//...
}
class Product {
Long id;
//...
}
class Sale {
SalesAssistant soldBy;
Customer buyer;
Set products;
//...
}
Q 2), В целом, как мы можем смоделировать не, n> = 3 отношения с, в спящем режиме?
Заранее спасибо.
Q1. Как мы можем смоделировать троичные отношения с помощью Hibernate? Например, как мы можем смоделировать представленные здесь троичные отношения с помощью Hibernate (или JPA)? (...)
Я бы переделал ассоциацию с промежуточным классом сущности (и это рекомендуемый способ в Hibernate). Применительно к вашему примеру:
@Entity
public class Sale {
@Embeddable
public static class Pk implements Serializable {
@Column(nullable = false, updatable = false)
private Long soldById;
@Column(nullable = false, updatable = false)
private Long buyerId;
@Column(nullable = false, updatable = false)
private Long productId;
public Pk() {}
public Pk(Long soldById, Long buyerId, Long productId) { ... }
// getters, setters, equals, hashCode
}
@EmbeddedId
private Pk pk;
@ManyToOne
@JoinColumn(name = "SOLDBYID", insertable = false, updatable = false)
private SaleAssistant soldBy;
@ManyToOne
@JoinColumn(name = "BUYERID", insertable = false, updatable = false)
private Customer buyer;
@ManyToOne
@JoinColumn(name = "PRODUCTID", insertable = false, updatable = false)
private Product product;
// getters, setters, equals, hashCode
}
Q1.1. Как мы можем смоделировать этот вариант, в котором у каждого элемента Sale может быть много Products?
Я бы не стал использовать здесь составной первичный ключ и ввел PK для сущности Sale
.
Q2. В общем, как мы можем моделировать n-арные отношения, n >= 3, с помощью Hibernate?
Я думаю, что мой ответ на вопрос 1. охватывает это. Если это не так, пожалуйста, поясните.
Обновление: Ответы на комментарии OP
(...) поля pk не заполняются и в результате я не могу сохранить элементы Sale в БД. Должен ли я использовать такие сеттеры для класса Sale? public void setBuyer(Customer cust) { this.buyer = cust; this.pk.buyerId = cust.getId(); }
Вам нужно создать новый Pk
(я удалил конструкторы из моего первоначального ответа для краткости) и установить его на Sale
элемент. Я бы сделал примерно так:
Sale sale = new Sale();
Pk pk = new Pk(saleAssistant.getId(), customer.getId(), product.getId());
sale.setPk(pk);
sale.setSoldBy(saleAssistant);
sale.setBuyer(customer);
sale.setProduct(product);
...
А затем сохранил sale
.
Также, в аннотации JoinColumn, на какой столбец ссылаются поля "name"? К пк целевых отношений или к собственным именам столбцов таблицы sale?
К столбцам для атрибутов составного пк
(т.е. к собственным именам столбцов таблицы sale), мы хотим, чтобы они получили ограничения PK и FK.
Используете ли вы первичные ключи, сгенерированные базой данных, для Customer, Product и SalesAssistant? Это может вызвать проблему, поскольку похоже, что вы пытаетесь использовать фактические идентификаторы БД, а не позволяете Hibernate разрешать ссылки на объекты во время фактического сохранения.
Встроенный ПК, приведенный выше, лично мне кажется странным, но у меня не было возможности попробовать его. Кажется, что столбцы перекрывают друг друга и затирают друг друга.
Думаю, достаточно иметь ссылки на ManyToOne.
Также включите отладку операторов SQL и посмотрите, что отправляется в БД.