Classes compostas JPA

2 respostas Resolvido
jpajava
D

Olá senhores,

Tenho minha classe Endereço que possui como atributo “filial”, ao mapear isso na classe Endereço, automaticamente ele irá criar a tabela Endereco, sendo que a FK serão as PKs de “filial”, conforme abaixo:

Endereco:

Filial:

Deposito:

No banco assim:

Porém se eu criar um novo atributo na classe Endereço do tipo “deposito” sendo que na classe deposito a PK também seja “empresa”, quando eu persistir isso, ele ira tentar criar mais um campo FK do tipo empresa na minha tabela Endereco.

Aparecendo o erro abaixo:

Eu queria que ele reconhecesse que já existe um atributo “USU_CODEMP” na tabela de Endereço e não tentasse cria-lo, isso é possível?

Obrigado,

2 Respostas

lvbarbosa
Solucao aceita

Não sei como resolver teu problema, mas faz sentido o erro que o provider está te dando. Você tá dizendo para ele que um único campo deve ser utilizado para mapear dois relacionamentos. Se você muda a Filial, o campo USU_CODEMP vai ser alterado, e o mesmo acontece para quando você mudar o Depósito.

Não sei se existe uma maneira de fazer o JPA obedecer o que você quer fazer, provavelmente tem, mas tem certeza que é isso que você quer?

Caso algum dos dois, a Filial ou o Deposito, seja imutável (caso na vida real não faça sentido trocar algum dos dois no objeto Endereco), acredito que se você seguir o conselho da mensagem de erro e defini-lo (o que não serial alterado) como read_only o problema será resolvido.

Por exemplo, se você acha que o atributo Filial do endereco nunca vai mudar, podemos defini-lo como read_only. Dessa forma, apenas o Deposito vai alterar o USU_CODEMP, se for alterado. Ainda assim, se você mudar o Deposito, vai mudar a Filial por causa do USU_CODEMP, para uma filial válida ou não.

O melhor caso seria o que nem a Filial nem o Deposito são mutáveis, todos read_only.

D

Funcionou! Eu criei uma nova classe, referenciei a classe “Endereco” com “Empresa” e adicionei o read_only no relacionamento de filial e deposito, ficou assim:

Obrigado.

Criado 6 de fevereiro de 2017
Ultima resposta 6 de fev. de 2017
Respostas 2
Participantes 2