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 @ EmbeddedIdEu 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?