Bom dia, tenho uma classe Orcamento e uma classe Obra, dentro do orçamento tem uma obra e vice-versa, é uma relação onetoone bidirecional, feito dessa forma:
Dentro do Orcamento:
@OneToOne
private Obra obra;
E dentro da obra:
@OneToOne(mappedBy = "obra")
private Orcamento orcamento;
Se eu gravar um orçamento com a obra de ocdigo 6, sendo que ja existe um orçamento com essa obra de codigo 6, ele grava normalmente, porém quando vou reuperar todos os orçamentos ou todas as obras usando a query, ele me da um erro dizendo que existe incosistencia:
[color=red]HibernateException: More than one row with the given identifier was found: 6, for class: beans.Orcamento[/color]
Como fazer a validação na hora de persistir o objeto?
coloque o id como único. HibernateException: More than one row with the given identifier was found: 6, for class: beans.Orcamento
De algum modo existe mais de uma linha com o mesmo ID.
mas então qual é a diferença de usar oneToOne e ManyToOne se eu vou ter que fazer uma validação por fora?
[quote=mateusviccari]mas então qual é a diferença de usar oneToOne e ManyToOne se eu vou ter que fazer uma validação por fora?[/quote]Quem falou que será validação por fora?
O conceito de chave primária é uma chave que não se repete. Por isso que ao usar o método getSingleResult tem aquela mensagem de erro. Seu banco não deve aceitar ID repetido.
Aqui explica quando utiliza OneToOne e OneToMany: JPA: Mini Livro - Primeiros passos e conceitos detalhados
Aqui explica sobre o método getSingleResult:JPA Consultas e Dicas
mesmo botando o @JoinColumn(unique=true) no atributo obra da classe orcamento, na hora de fazer o persist ele não gera a excessão como deveria. o que devo fazer nesse caso?
Olha só o que eu percebi que ele faz:
vamos supor que nao tenho nenhum orçamento na tabela, ai eu mando criar um orçamento com a obra 6 e dou o commit
depois disso eu mando criar outro orçlamento com a obra 6 e ele deixa, entao vai ficar 2 orçamentos com a obra 6
aí se eu tentar mais uma vez, criar um orçamento com a obra 6, aí sim ele me da o erro dizendo que ja existe um orçamento com a obra 6…
Ou seja, ele só faz a validação na terceira vez que eu tentar gravar, e não em todas as vezes como seria o adequado…
será que é um bug do hibernate ou algo assim?