Dúvida Hibernate - update

3 respostas
Marques

Colegas,

Tenho as classes NotaFiscal e NotaFiscalItem conforme abaixo.
Ao criar uma NotaFiscal crio antes um List, atualizo esse List na NotaFiscal e gravo. Funciona Ok.
Quando excluo a NotaFiscal todos os itens referentes a essa NotaFiscal são excluuidos também. Funciona Ok.

Agora, se tenho uma NotaFiscal com, por exemplo, 2 itens, excluo um item do List, atualizo a NotaFiscal com o novo List (que agora só tem um item) e faço um update o MySQL continua com os 2 itens.

Pergunto: Como eu faço para a alteração feita no list seja feita também no banco MySQL?

Muito obrigado,

Marques
@Entity
@Table(name="nota_fiscal")
public class NotaFiscal implements Serializable {
	
	@Id @GeneratedValue(strategy=GenerationType.AUTO)
	private Integer id;
	
	@OneToMany(fetch = FetchType.LAZY, mappedBy ="notaFiscal", cascade = CascadeType.ALL)
	private List<NotaFiscalItem> itens;
	
	//get and setters omitidos
}
@Entity
@Table(name="nota_fiscal_item")
public class NotaFiscalItem {
	
	@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
	private Integer id;
	
	@ManyToOne
    @JoinColumn(name = "idNotaFiscal") 
	private NotaFiscal notaFiscal;
	
	//getters and setters omitidos

}

3 Respostas

Flavio_Almeida

Qual versão do Hibernate você está usando?

Se for com suporte a JPA 2, experimente fazer o seguinte:

@OneToMany(fetch = FetchType.LAZY, mappedBy =“notaFiscal”, cascade = CascadeType.ALL, orphanRemoval=true)

Veja que adicionei a opção orphanRemoval=true.

Você precisa ter certeza que ninguém tem uma referência à coleção que você está “removendo”.

Tenta isso. Se não funcionar, vamos seguir outra estratégia.

Marques

Flavio,

Não uso o JPA 2. Tem com resolver sem o uso do mesmo? Muito obrigado,

Marques

Flavio_Almeida

Sim, há. Eu estou enrolado hoje à tarde, mas para adiantar:

1 - No lugar de setar uma coleção nova, remova cada item com remove() e depois dê um flush antes de incluir.
2 - Esta opção presente no JPA 2 também existe no Hibernate.

Se você tiver relacionamento bidirecional, terá que ter atenção dobrada.

Tentarei responder com mais calma amanhã na parte da manhã.

Abraço

Criado 13 de outubro de 2010
Ultima resposta 13 de out. de 2010
Respostas 3
Participantes 2