JPA mapeando Multiplas Foreign Key constraints em uma única coluna da tabela

Prezados,

Tenho várias situações em muitos modelos complexos muito normalizados em que é importante a criação de mais do que uma restrição de chave estrangeira (constraint) para uma determinada coluna da tabela.

Esses modelos são feitos em modeladores como o Sybase PowerDesigner e depois criado no banco de dados Oracle ou PostgreSQL, sem problemas.

Porém, não consegui encontrar um meio de mapear tal situação pelo JPA.

Econtra-se com facilidade na internet como modelar duas ou mais colunas para uma forein key constraint. Também se encontra respostas ensinando como criar duas ou mais chaves estrangeiras na mesma tabela, porém cada uma em uma coluna diferente.

Entretanto, neste caso a necessidade é diferente, seria mapear duas (ou mais) Foreign Key constraints diferentes para a mesma coluna, utilizando o JPA.

Alguém saberia informar como proceder?

Desde já, obrigado.

Usa JdbcTemplate. Além de JPA/Hibernate ser mais complicado de domar, é mais pesado.

Prezado,

Obrigado pela resposta. Entretanto, abandonar o JPA será a última opção a ser adotada, pois temos muita coisa já desenvolvida e trabalhada com ele. Vou tentar encontrar uma solução com JPA;

Será que existe alguma maneira de adicionar uma instrução SQL para a construção da constraint em algum tipo de anotação genérica? Estou pensando aqui…

Eu não sei se entendi bem o que você quer, mas isso aqui não bastaria?
link

Entendo. Quando passo por esse caso eu ignoro totalmente mapeamentos/entidades e faço chamadas diretamente via SQL com createNativeQuery do próprio Jpa/Hibernate. Não é tão prático quando JdbcTemplate, mas pelo menos me livra das amarrações do modelo OO.

1 curtida

Prezado, obrigado pela resposta. Mas não seria este o objetivo. No exemplo que você traz, ele ensina como colocar outro tipo de constraint. Eu preciso de duas ou mais Foreign Key constraint na mesma coluna.

Imagine um cenário onde três ou quatro tabelas tem como chave primária, em cada uma delas, uma coluna id, todas do tipo numérico long. Na verdade o que eu busco é que o motor do banco de dados crie uma restrição para impedir que um registro seja inserido em uma tabela antes que o seu id seja inserido também como id em outras duas ou três tabelas diferentes, em um modelo onde todas estas três ou quatro tabelas precisariam ter o mesmo id.

Ou seja, em uma destas tabelas citadas acima, não será possível inserir um registro com id=5, antes que em cada uma das outras tabelas já exista um registro com id=5 também.

Esta é a restrição que preciso criar no modelo com o JPA.

Mas nesse exemplo que você me mostrou, o valor da "id " vai representar algo para a aplicação ou serve meramente para indicar um item único?
Porque se for um valor só para identificar o item, você pode fazer as três tabelas utilizarem a mesma sequence, desse modo seria garantido que só haveria apenas um id entre essas tabelas.
Mas acredito que no seu caso essa solução não se aplicará. Imagino que deva existir uma coluna onde os valores são definidos pelos usuários e não gerados. Nesse caso:

Sim, o id representa uma entidade. De fato, creio que a solução seja o createNativeQuery mesmo, pois não estou conseguindo encontrar uma outra solução.