0

私には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);
    }
}
4

1 に答える 1

0

カスタマイザはこれに影響を与えないはずです。これは、通常は@OneToManyで使用されるmappedByを使用する代わりに、@JoinColumnを使用していることが原因である可能性があります。

isCascadeOnDeleteSetOnDatabase()を使用して、カスタマイザーでマッピングを確認できます。

またはを使用して設定します

mapping.setIsCascadeOnDeleteSetOnDatabase(true)

于 2012-12-12T15:46:46.453 に答える