【问题标题】:Ecliplselink - @CascadeOnDelete doesn't work with @CustomizerEcliplselink - @CascadeOnDelete 不适用于 @Customizer
【发布时间】:2012-12-12 12:14:50
【问题描述】:

我有两个实体。 “价格”类将“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);
    }
}

【问题讨论】:

    标签: jpa eclipselink sortedmap


    【解决方案1】:

    您的定制器应该对此没有影响。这可能是因为您使用的是 @JoinColumn 而不是通常应该在 @OneToMany 中使用的 mappedBy。

    您可以使用 isCascadeOnDeleteSetOnDatabase() 在自定义程序中检查映射

    或使用设置它

    mapping.setIsCascadeOnDeleteSetOnDatabase(true)

    【讨论】:

    • 感谢您的建议。当我在 OneToMany 和 CascadeOnDelete 上同时使用 orphanRemoval = true 时,它​​绝对有效。现在没有时间尝试这个,可能一个就足够了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-09
    • 1970-01-01
    • 2014-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多