Что если сущность, на которую вы хотите сослаться, имеет составной ключ? Можно ли использовать MapsId для нескольких столбцов во встроенном идентификаторе?
ашиваю и отвечаю на свой вопрос, но я не предполагаю, что у меня есть лучший ответ. Если у вас есть лучший, пожалуйста, отправьте это!Смежные вопросы:
Как установить обратную ссылку из @EmbeddedId в JPA
отображение спящего режима, где встраиваемый (?)JPA Составной ключ с @EmbeddedIdУ меня есть пара классов, которые находятся в простых отношениях агрегации: любому экземпляру одного принадлежит некоторое количество экземпляров другого. Класс-владелец имеет своего рода первичный ключ, а класс-владелец имеет множество-один для этого класса через соответствующий внешний ключ. Я хотел бы, чтобы принадлежащий класс имел первичный ключ, содержащий этот внешний ключ, плюс некоторую дополнительную информацию.Для аргумента давайте использовать эти постоянные фавориты, Order и OrderLine.
SQL выглядит примерно так:
Я хотел бы отобразить это в Java с использованием JPA. Order является тривиальным, и OrderLine может быть обработан с помощью @IdClass.
-- 'order' may have been a poor choice of name, given that it's an SQL keyword!
create table Order_ (
orderId integer primary key
);
create table OrderLine (
orderId integer not null references Order_,
lineNo integer not null,
primary key (orderId, lineNo)
);
Вот код для этого - код довольно условен, и я надеюсь, что вы простите мои идиосинкразии.Однако использование @IdClass предполагает написание класса ID, который дублирует поля в OrderLine. Я бы хотел избежать такого дублирования, поэтому вместо этого я бы хотел использовать @EmbeddedId.
Однако наивная попытка сделать это терпит неудачу:
OpenJPA отвергает использование этого в качестве @EmbeddedId. Я не пробовал других провайдеров, но не ожидал, что они преуспеют, потому что спецификация JPA требует, чтобы поля, составляющие класс ID, были базовыми, а не отношениями.
@Embeddable
public class OrderLineKey {
@ManyToOne
private Order order;
private int lineNo;
}
Так что я могу сделать? Как я могу написать класс, ключ которого содержит отношение @ManyToOne, но обрабатывается как @EmbeddedId?
Я не знаю способа сделать это, который не предполагает дублирование каких-либо полей (извините!). Но это может быть сделано простым и стандартным способом, который предполагает дублирование только полей отношений. Ключ является