私には2つのエンティティがあります。「Price」クラスには、SortedMapフィールドとして「CalculableValue」が格納されています。ソートされたマップをサポートするために、カスタマイザーを作成しました。その後、@CascadeOnDeleteが機能していないようです。マップからCalculableValueインスタンスを削除してから「価格」を保存すると、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);
}
}