我有两个实体。 “Price”类将“CalculableValue”存储为SortedMap字段。 为了支持有序的地图,我写了定制器。在那之后,似乎@CascadeOnDelete无效。如果我从map中删除了CalculableValue实例,然后保存“Price”EclipseLink只在computeableValues表中将priceId列更新为NULL ...
我真的想保留SortedMap。它有助于避免Java级别的值访问的大量常规工作。 此外,在CalculableValue类中没有定义反向引用(ManyToOne),应用程序逻辑永远不需要它,因此,只想保持一种方式。
任何想法解决此问题的最佳方法是什么?我实际上有很多其他类似的依赖,几乎所有东西都是OneToMany与存储在有序映射中的值的关系。
Price.java:
@Entity
@Table(uniqueConstraints={
@UniqueConstraint(columnNames={"symbol", "datestring", "timestring"})
})
@Customizer(CustomDescriptorCustomizer.class)
public class Price extends CommonWithDate
{
...
@CascadeOnDelete
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@MapKeyColumn(name="key")
@JoinColumn(name = "priceId")
private Map<String, CalculatedValue> calculatedValues =
new TreeMap<String, CalculatedValue>();
...
}
public class CustomDescriptorCustomizer implements DescriptorCustomizer
{
@Override
public void customize(ClassDescriptor descriptor) throws Exception
{
DatabaseMapping jpaMapping = descriptor.getMappingByAttribute("calculatedValues");
((ContainerMapping) mapping).useMapClass(TreeMap.class, methodName);
}
}
答案 0 :(得分:0)
您的自定义程序不应对此产生任何影响。这可能是因为您使用的是@JoinColumn而不是使用通常应在@OneToMany中使用的mappedBy。
您可以使用isCascadeOnDeleteSetOnDatabase()
检查自定义程序中的映射或使用
设置mapping.setIsCascadeOnDeleteSetOnDatabase(真)