Pai com VersionLockingPolicy em cascata não pegando alterações no banco de dados em objetos infantis de propriedade privada
-
21-09-2019 - |
Pergunta
Eu tenho um objeto pai com uma política de bloqueio de versão definida da seguinte forma:
VersionLockingPolicy lockingPolicy = new VersionLockingPolicy();
lockingPolicy.setIsCascaded(true);
lockingPolicy.setWriteLockFieldName("CacheId");
descriptor.setOptimisticLockingPolicy(lockingPolicy);
E com uma criança mapeada da seguinte maneira:
OneToManyMapping childMapping = new OneToManyMapping();
childMapping.setAttributeName("children");
childMapping.setReferenceClass(Child.class);
childMapping.dontUseIndirection();
childMapping.privateOwnedRelationship();
childMapping.useBatchReading();
childMapping.useCollectionClass(ArrayList.class);
childMapping.addTargetForeignKeyFieldName("Child.ParentId", "Parent.Id");
descriptor.addMapping(childMapping);
Quando troco um campo na criança e atualizo o cacheID filho diretamente no banco de dados, as consultas Eclipselink não atendem a alteração. Quando atualizo o cacheid do objeto pai, as consultas Eclipselink retornam a alteração para o campo filho.
Eu pensei que a política de bloqueio de versão em cascata deveria fazer com que os pais atualizassem quando algum de seus objetos infantis de propriedade privada foi atualizada (conforme definido por seus campos de versão). Eu estava errado sobre isso, ou provavelmente há algo errado em outro lugar no meu código?
Solução 2
Eu estava errado. Não há nada no código Eclipselink que fará o que eu queria.
Acho que vou simplesmente adicionar um gatilho aos objetos filhos para atualizar o cacheid pai.
Outras dicas
Basta usar o seguinte na classe de entidade pai:
@OptimisticLocking(cascade = true)
e Mark @onetomany com @privateowned
Isso funciona apenas se você usar a coluna da versão. Por favor, verifique: