Родитель с каскадным VersionLockingPolicy, не принимающим изменения базы данных в дочерние объекты, находящиеся в частной собственности
У меня есть родительский объект с политикой блокировки версий, определенной следующим образом:
VersionLockingPolicy lockingPolicy = new VersionLockingPolicy();
lockingPolicy.setIsCascaded(true);
lockingPolicy.setWriteLockFieldName("CacheId");
descriptor.setOptimisticLockingPolicy(lockingPolicy);
и с ребенком отображается следующим образом:
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);
Когда я изменяю поле дочернего элемента и обновляю дочерний cacheId непосредственно в базе данных, запросы eclipselink не воспринимают это изменение. Когда я затем обновляю cacheId родительского объекта, запросы eclipselink возвращают изменение в дочернее поле.
Я думал, что каскадная политика блокировки версий должна была вызывать обновление родительского элемента при обновлении любого из его дочерних дочерних объектов (как определено их полями версий). Был ли я неправ в этом, или, вероятно, что-то не так в моем коде?
2 ответа
Я был неправ. В коде eclipselink нет ничего, что могло бы сделать то, что я хотел.
Я думаю, что я просто добавлю триггер к дочерним объектам для обновления родительского cacheId.
Просто используйте следующее в родительском классе сущности:
@OptimisticLocking(cascade = true)
и пометить @OneToMany с помощью @PrivateOwned
Это работает, только если вы используете столбец версии. Пожалуйста, проверьте:
http://wiki.eclipse.org/Using_EclipseLink_JPA_Extensions_(ELUG)