Como criar uma chave primária composta que contém um atributo @ManyToOne como um @EmbeddedId no JPA?

Eu estoufazer e responder minha própria pergunta, mas não estou assumindo que tenho a melhor resposta. Se você tiver um melhor, poste-o!

Perguntas relacionadas

Como definir uma referência anterior de um @EmbeddedId no JPAhibernate mapping where embeddedid (?)have @JPA Composto com @ EmbeddedId

Eu tenho um par de classes que estão em um relacionamento de agregação simples: qualquer instância de uma possui algum número de instâncias da outra. A classe proprietária possui algum tipo de chave primária própria e a classe própria possui muitos para um nessa classe por meio de uma chave estrangeira correspondente. Gostaria que a classe proprietária tivesse uma chave primária que contenha essa chave estrangeira, além de algumas informações adicionai

Por uma questão de argumento, vamos usar os favoritos eternos, Order e OrderLin

O SQL se parece com isso:

-- '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)
);

Gostaria de mapear isso em Java usando JPA. O pedido é trivial e o OrderLine pode ser tratado com um @IdClass. Aqui está o código para isso - o código é bastante convencional e espero que você perdoe minhas idiossincrasia

No entanto, usar o @IdClass envolve escrever uma classe de ID que duplica os campos no OrderLine. Gostaria de evitar essa duplicação, então gostaria de usar o @EmbeddedI

No entanto, uma tentativa ingênua de fazer isso falha:

@Embeddable
public class OrderLineKey {
    @ManyToOne
    private Order order;
    private int lineNo;
}

@OpenJPA rejeita o uso disso como um @EmbeddedId. Não tentei outros provedores, mas não esperaria que eles fossem bem-sucedidos, porque a especificação JPA exige que os campos que compõem uma classe de ID sejam básicos, não relacionamento

Então o que eu posso fazer? Como posso escrever uma classe cuja chave contém o relacionamento @ManyToOne, mas é tratada como um @EmbeddedId?

questionAnswers(1)

yourAnswerToTheQuestion