具有级联VersionLockingPolicy的父级不会将数据库更改提取到私有子对象

时间:2009-11-19 15:56:01

标签: java eclipselink

我有一个父对象,其版本锁定策略定义如下:

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 个答案:

答案 0 :(得分:1)

在父实体类上使用以下内容:

@OptimisticLocking(cascade = true)

并使用@PrivateOwned标记@OneToMany

仅当您使用版本列时才有效。请检查:

http://wiki.eclipse.org/Using_EclipseLink_JPA_Extensions_(ELUG)#Using_EclipseLink_JPA_Extensions_for_Optimistic_Locking

答案 1 :(得分:0)

我错了。 eclipselink代码中没有任何内容可以执行我想要的操作。

我想我会简单地在子对象上添加一个触发器来更新父cacheId。