Что если сущность, на которую вы хотите сослаться, имеет составной ключ? Можно ли использовать 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?

Я не знаю способа сделать это, который не предполагает дублирование каких-либо полей (извините!). Но это может быть сделано простым и стандартным способом, который предполагает дублирование только полей отношений. Ключ является

Ответы на вопрос(1)

Ваш ответ на вопрос