Por JPA não vai excluir entidades detidas quando a entidade proprietário perde a referência a eles?

StackOverflow https://stackoverflow.com/questions/1133179

  •  16-09-2019
  •  | 
  •  

Pergunta

Eu tenho uma entidade JPA "Request", que possui uma lista de respostas (também entidades JPA). Aqui está como ele é definido no Request.java:

@OneToMany(cascade= CascadeType.ALL, mappedBy="request")
private List<Answer> answerList;

E em Answer.java:

@JoinColumn(name = "request", referencedColumnName="id")
@ManyToOne(optional = false)
private Request request;

No decurso da execução do programa, do Pedido Lista de respostas podem ter respostas adicionados ou removidos a partir dele, ou o objeto lista real pode ser substituído. Meu problema é o seguinte: quando eu mesclar um pedido ao banco de dados, a resposta objetos que usado para estar na lista são mantidos no banco de dados - isto é, Resposta objetos que o pedido já não detém um referência a (indiretamente, através de uma lista) não são excluídos.

Este não é o comportamento que eu desejo, como se eu mesclar um pedido ao banco de dados, e depois buscá-la de novo, a sua lista de respostas podem não ser os mesmos. Eu estou fazendo algum erro de programação? Existe uma anotação ou configuração que irá garantir que as respostas no banco de dados são exatamente as respostas do Pedido Lista?

A solução é manter referências às respostas originais de lista e, em seguida, usar o EntityManager para remover cada idade Resposta antes de fundir o pedido, mas parece que deve haver uma maneira mais limpa.

Foi útil?

Solução

Em JPA 1.0, o que você quer fazer não pode ser feito por JPA. Simplesmente, toda a gestão de relacionamento deve ser feito pelo aplicativo, incluindo a remoção de quaisquer órfãos de coleções (que é o que você está tentando fazer).

Em JPA 2.0, que fazem suporte (embora eu não sei os detalhes), mas dependendo de sua implementação, uma atualização pode não ser fácil ou possível.

Você também pode usar algo como Hibernate diretamente, mas ainda usam muitos JPA 1.0 anotações, etc. eu não posso fornecer detalhes sobre o que quer.

No meu caso eu escrevi código genérico para alça fusão de coleções automaticamente através de reflexão.

Outras dicas

Usando EclipseLink e colocando anotação @PrivateOwned para answerList ajudaria.

É ilegal para especificar propriedades adicionais em relação mapeada. Você pode usar a anotação @DependentElement em Request vez.

Se você usar Hibernate como provedor JPA, você pode adicionar um

@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)

no answerList. Isso poderia funcionar para além das anotações JPA que você usa já. JPA 2 (mais / todos os provedores JPA não tem um pronto implementação de produção neste momento) pode fazer isso por conta própria.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top