Pergunta

Desculpe se isso é um ingênuo, não poderia encontrá-lo mas não tivemos realmente sabe o que procurar, de qualquer maneira ...

Eu tenho três classes, Parent, Child e Other

Parent tem muitas Child onde uma criança tem uma coluna Parent_Id

Other contém uma referência a um Child através de uma coluna Child_Id

Quando eu excluir um Parent, eu também pretende eliminar todos os objetos Child associados. Se estes Child objetos são referenciados por quaisquer classes Other, eu quero seus (os objetos Other) referências Child_Id a ser anulado.

Que regras cascata que eu preciso sobre os dois relacionamentos?

Além disso, será entidades atualização NHibernate na memória, bem como no banco de dados?

i. se eu tenho um monte de Parent, Child e Other na memória (ou seja carregado a partir db, não transitória) e dizer-NH para apagar um Parent, o que vai acontecer? Presumo que a Parent e objetos Child se tornará transitória? O que acontecerá com a propriedade Child de quaisquer objetos Other?

Editar: quando se usa All-delete-orphan, o que as classes um objeto como um órfão? No exemplo acima, é um Child órfão se a sua Parent pai é excluído? Será que a referência da matéria Other quando se considera uma entidade como órfãs?

Graças

Foi útil?

Solução

NH não atualizar qualquer das suas entidades na memória (exceto de IDs e versões). NH não é responsável para gerir as relações de vocês entidades. Ele só persiste o que você fez na memória para o banco de dados.

A partir deste ponto de vista, deve tornar-se mais fácil de entender.

meios cascade="delete" que quando o pai for excluído, a criança fica excluído também. meios cascade="delete-orphan", que, adicionalmente, a criança é mesmo suprimido se há referências de pais mais. Isto, naturalmente, só funciona se a criança está na sessão.

A instância excluído fica transitória na memória. Referências para o exemplo transiente (a partir de Other) fará com que uma excepção. AFAIK, você precisa remover referência a casos excluídos por si mesmo. Provavelmente, você pode torná-lo implícito por alguns truques, mas eu duvido que isso vai ser limpo. É da lógica de negócios.

Para relações pai-filho, cascade="all-delete-orphan" é apropriado.

Para referência regulares prefiro cascade="none".

Há um grande explicação por Ayende Rahien

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