我有两个实体。“价格”类将“CalculableValue”存储为 SortedMap 字段。为了支持排序地图,我编写了定制器。在那之后,@CascadeOnDelete 似乎不起作用。如果我从地图中删除 CalculableValue 实例,然后保存“价格”EclipseLink 只会将 calculableValues 表中的 priceId 列更新为 NULL ...
我真的很想保留 SortedMap。它有助于避免 Java 级别的值访问的大量日常工作。此外,CalculableValue 类中没有定义反向引用(ManyToOne),应用程序逻辑永远不需要它,因此,只想保持一种方式。
任何想法什么是解决这个问题的最佳方法?我实际上有很多其他这样的依赖关系,几乎所有东西都是 OneToMany 与存储在排序映射中的值的关系。
价格.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);
}
}