Pergunta

Estou tentando fazer um aplicativo que mantenha um modelo de objeto sincronizado com um banco de dados observando todas as alterações e depois persistindo imediatamente os objetos em perguntas. Muitos dos objetos do modelo têm filhos em grandes listas ou árvores.

Quando carrego um objeto do banco de dados, confio em um relacionamento em cascata unidirecional para também recuperar todos os seus filhos e incluí-los no aplicativo.

No entanto, é possível alterar um campo no objeto pai que requer persistência e posso determinar que nenhuma das crianças é afetada. Então, eu gostaria de persistir para os pais, sem atingir o banco de dados com toda a criança em cascata persiste.

por exemplo

@Entity
public class Parent {

    @OneToMany(cascade=CascadeType.ALL)
    public List children;

}

Como posso substituir a opção Cascade quando persistir um objeto pai? Ou devo apenas configurá -lo para atualizar e garantir que nunca precise de uma persistência em cascata?

Foi útil?

Solução

Ler os objetos do banco de dados e persistir depende de duas anotações diferentes.

Quando você carrega um objeto, ele também terá o outro extremo de qualquer ansioso (FetchType.EAGER) relacionamentos, conforme definido pela propriedade buscar o relacionamento.

Dependendo do seu provedor JPA, você pode ter opções para substituir esse comportamento. Eclipselink, através do incrivelmente útil QueryHint.BATCH, certamente faz.

Quando você persistir, excluir ou atualizar, o tipo de cascata é o que é relevante.

Portanto, perca a cascata, mantenha a busca e o problema resolvido.

Pessoalmente, acho que Cascade tudo está pedindo problemas, mas as opiniões variam.

Um provedor JPA decente já terá um esquema de cache bastante sofisticado (configurável). Talvez você deva estar perguntando por que está reinventando essa roda em particular?

É uma questão de atualizações assíncronas puramente para desempenho? Ou é outra coisa o motivo?

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