JPA @ManyToOne com CascadeType.ALL

Eu acho que sinto falta de entender o significado de cascata no contexto do relacionamento @ManyToOne .

O caso:

 public class User { @OneToMany(fetch = FetchType.EAGER) protected Set
userAddresses; } public class Address { @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL) protected User addressOwner; }

Qual é o significado da cascade = CascadeType.ALL ? Por exemplo, se eu excluir um determinado endereço do database, como é que eu adicionei a cascade = CascadeType.ALL afeta meus dados (o usuário eu acho)?

    O significado de CascadeType.ALL é que a persistência irá propagar (cascatear) todas as operações do EntityManager ( PERSIST, REMOVE, REFRESH, MERGE, DETACH ) para as entidades relacionadas.

    Parece, no seu caso, ser uma má ideia, pois a remoção de um Address levaria à remoção do User relacionado. Como um usuário pode ter vários endereços, os outros endereços se tornariam órfãos. No entanto, o caso inverso (anotando o User ) faria sentido – se um endereço pertencer apenas a um único usuário, é seguro propagar a remoção de todos os endereços pertencentes a um usuário se esse usuário for excluído.

    BTW: você pode querer adicionar um mappedBy="addressOwner" ao seu User para sinalizar ao provedor de persistência que a coluna de junit deve estar na tabela ADDRESS.

    Veja aqui um exemplo dos documentos do OpenJPA. CascadeType.ALL significa que fará todas as ações.

    Citar:

    CascadeType.PERSIST: Ao persistir uma entidade, também persistem as entidades mantidas neste campo. Sugerimos a aplicação liberal dessa regra em cascata, porque se o EntityManager encontrar um campo que referencia uma nova entidade durante o flush e o campo não usar o CascadeType.PERSIST, será um erro.

    CascadeType.REMOVE: Ao excluir uma entidade, exclua também as entidades contidas neste campo.

    CascadeType.REFRESH: Ao atualizar uma entidade, atualize também as entidades contidas nesse campo.

    CascadeType.MERGE: Ao mesclar o estado da entidade, também mescla as entidades mantidas nesse campo.

    Sebastian

    Da especificação EJB3.0 :

    O uso do elemento de anotação em cascata pode ser usado para propagar o efeito de uma operação para entidades associadas. A funcionalidade de cascata é normalmente usada em relacionamentos pai-filho.

    Se X for uma entidade gerenciada, a operação de remoção fará com que ela seja removida. A operação de remoção é em cascata para entidades referenciadas por X, se os relacionamentos de X para essas outras entidades forem anotados com o valor do elemento de anotação cascade = REMOVE ou cascade = ALL.

    Portanto, em poucas palavras, os relacionamentos de entidades definidos com o CascadeType.All garantirão que todos os events de persistência, como persistir, atualizar, mesclar e remover, que ocorrem no pai, sejam passados ​​para o filho. A definição de outras opções CascadeType fornece ao desenvolvedor um nível mais granular de controle sobre como a associação de entidades manipula a persistência.

    Por exemplo, se eu tivesse um object Book que contivesse uma lista de páginas e eu adicionasse um object de página dentro dessa lista. Se a anotação @OneToMany definir a associação entre Livro e Página estiver marcada como CascadeType.All , a persistência do Book resultaria na persistência da Página no database.

    Como expliquei neste artigo e em meu livro, High-Performance Java Persistence , você nunca deve usar CascadeType.ALL em CascadeType.ALL pois as transições de estado de entidade devem se propagar de entidades Pai para Criança.

    O lado @ManyToOne é sempre a associação Child, pois deve mapear o FK subjacente.

    Portanto, mova o CascadeType.ALL da associação @OneToMany para o @OneToMany que deve usar o atributo mappedBy já que é o mapeamento um-para-muitos mais eficiente . `

    Na JPA 2.0, se você quiser excluir um endereço, se você o removeu de uma entidade User, você pode adicionar orphanRemoval=true (em vez de CascadeType.REMOVE ) ao seu @OneToMany .

    Mais explicação entre orphanRemoval=true e CascadeType.REMOVE está aqui .