Estou com o seguinte cenário: o usuário deleta um registro da lista e depois ele tenta inserir o mesmo objeto na lista e ai recebo um erro de Unique Constraint, pois o entityManager faz um insert primeiro do delete.
Alguém já passou por este problema?
Desde já agradeço a ajuda de todos.
nao da pra dar um flush() depois do delete?
[quote=mauricioadl]nao da pra dar um flush() depois do delete?[/quote]Ou fazer as operações em transações separadas.
Não, é requisito do sistema fazer tudo de uma vez só, pois dizem que o cliente pode abandonar a tela antes de salvar e o banco ficar com registros “sujos”.
[quote=Jedi_FeniX]Não, é requisito do sistema fazer tudo de uma vez só, pois dizem que o cliente pode abandonar a tela antes de salvar e o banco ficar com registros “sujos”.[/quote]Oi?
Ele pode na mesma chamada fazer as duas coisas… O.o
public void fazAlgo(){
apagaOsTrens(lista); // transação nova begin+commit
criaOsTrens(lista); // transação nova begin+commit
}
A não ser que você esteja utilizando open session in view para controle de transação, aí só o flush nesse caso();.
Não sei se o JPA trataria como nested transaction ao tentar abrir uma nova transação em uma já existente.
Vamos lá existe a seguinte estrutura:
Objeto Pai:
[code]
public class Pai{
@OneToMany(fetch = FetchType.EAGER, mappedBy = “pai”, cascade = CascadeType.ALL, orphanRemoval = true)
@Fetch(FetchMode.SUBSELECT)
private List filhos;
}[/code]
Objeto Filho:
[code]
public class Filho {
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = “Filho_do_filho_id”, nullable = false)
private FilhoDoFilho filhoDoFilho;
}[/code]
O usuário na view pode tirar o relacionamento filhoDoFilho com a entidade filho, e quando ele clicar em salvar o objeto pai será persistido, pois o mesmo está na sessão.
Sim, estou usando open session in view.
O problema só ocorre quando o usuário tenta inserir o mesmo objeto dentro da mesma transação, quando são objetos novos ou objetos removidos entityManager trabalhar tranquilamente com os inserts e deletes.
Tentei detalhar um pouco mais o cenário para ajudar… não sei se ficou bom…
Eu estou desde manhã procurando uma solução para esta questão e desde que me deparei com este erro tenho na cabeça que isso é um problema de modelagem e confirmei com alguns links que estão pela internet, segue um deles, aonde eles falam que este cenário é relacionado a um objeto reencarnado:
http://en.wikibooks.org/wiki/Java_Persistence/Persisting#Reincarnation
Muito Obrigado pela ajuda, mas acho que não tenho muitas alternativas neste cenário.