我有两个实体。"Price“类将"CalculableValue”存储为SortedMap字段。为了支持排序映射,我编写了customizer。在那之后,@CascadeOnDelete似乎不起作用了。如果我从映射中删除CalculableValue实例,然后保存"Price“,则EclipseLink仅在calculableValues表中将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);
}
}发布于 2012-12-12 23:46:46
你的定制器应该对此没有影响。这可能是因为您使用的是@JoinColumn而不是通常应该在@OneToMany中使用的mappedBy。
您可以使用isCascadeOnDeleteSetOnDatabase()检查定制器中的映射。
或使用以下命令设置它
mapping.setIsCascadeOnDeleteSetOnDatabase(true)
https://stackoverflow.com/questions/13839570
复制相似问题