首页 文章

Ecliplselink - @CascadeOnDelete不适用于@Customizer

提问于
浏览
0

我有两个实体 . “Price”类将“CalculableValue”存储为SortedMap字段 . 为了支持有序的 Map ,我写了定制器 . 在那之后,似乎@CascadeOnDelete无效 . 如果我从map中删除了CalculableValue实例,然后保存“Price”EclipseLink只在computeableValues表中将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);
    }
}

1 回答

  • 0

    您的自定义程序应该对此没有任何影响 . 这可能是因为您正在使用@JoinColumn而不是使用通常应在@OneToMany中使用的mappedBy .

    您可以使用isCascadeOnDeleteSetOnDatabase()检查定制器中的映射 .

    或者使用它来设置

    mapping.setIsCascadeOnDeleteSetOnDatabase(真)

相关问题