Cascata em (N) Hibernate, quais as regras que eu preciso?
-
19-09-2019 - |
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
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"
.