Dúvida Hibernate - update

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

[code]
@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

}[/code]

[code]
@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

}[/code]

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.

Flavio,

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

Marques

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