Hibernate - NonUniqueObjectException

2 respostas
heatcold

Supondo que eu tenha tres entidades:

Fabricante Peca Especificacao

Considerando os seguintes relacionamentos:

Fabricante 1 ------- * Peca * ------- 1 Especificacao

Meu problema é que quando eu tendo adicionar uma nova peça, se
alguma das peças já cadastradas possuir a mesma especificação desta peça,
eu não consigo adicionar esta peça na lista de peças do fabricante pois a
especificação violará NonUniqueObjectException da sessão.

Exemplo:

.Fabricante "F1" .. Peça "P1" - Especificacao "E1" .. Peça "P2" - Especificacao "E2"

Quando eu tento adicionar a peça “P3” - “E1” eu não consigo a não
ser que eu caminhe pela lista de peças de “F1” buscando essa especificacao e a
use caso eu a encontre.

Essa busca seria muito custosa quando eu tivesse um numero elevado de peças.

Qual a solução para essa situação?

2 Respostas

jj_df

Cara eu dei uma olhada mais ou menos na sua dúvida, não deu pra entender muito bem o seu problema mas a modelagem do seu banco imagino que esteja assim:

Tabela Fabricante
PK idFabricante
FK idPeca
     fabricante

Tabela Peça
PK idPeca
FK idEspecificacao
    peca

Tabela Especificacao
PK idEspecificacao
     especificacao

Nesse caso, como a tabela Peça tem uma chave estrangeira em Especificação, não importa o número de peças que você tem porque a sua tabela e especificações estará agrupada, ou seja, sem 1 peça com a especificação 'Chave de fenda' ou mil peças com a especificação 'Chave de fenda', na sua tabela de especificações você terá apenas uma linha:

idEspecificacao     Especificacao
0                         Chave de Fenda

Se você quiser normalizar seu banco dessa forma, não vejo outra forma de inserir uma nova peça sem descobrir se na tabela de especificacao já existe essa especificação ou não... Sei lá, coloca um ComboBox com todas as especificações exsitentes na tabela pro cara escolher, e a última opção do ComboBox você colocar 'Outra...', se o cara escolher essa opção você abre uma janela pra ele poder inserir uma nova especificação!!!

Espero ter ajudado e não complicado mais....hehehhehehe!!!

heatcold

jj_df muito obrigado pela sua resposta. Resolvi o problema fechando a sessão antes de inserir uma nova peça e usando merge para atualizar a lista de peças do fabricante.

Criado 15 de abril de 2008
Ultima resposta 15 de abr. de 2008
Respostas 2
Participantes 2