DiscriminatorFormula在select上执行,但在delete语句上不执行

时间:2019-04-09 18:22:19

标签: java hibernate jpa discriminator

我正在尝试建立一个没有具体鉴别符值的单表继承策略,因此在我的超类上使用@DiscriminatorFormula,设置如下:

@Table
@DiscriminatorFormula("case when type in ('4','5','6') then 'model.bo.A' else 'model.bo.B' end ")
@Inheritance(strategy = SINGLE_TABLE)
public abstract class S {
    ...
}

@Entity
public class A extends S {

    @ManyToOne
    @JoinColumn(name = "ID")
    private ContactPersonBo contactperson;
}

@Entity
public class B extends S {

    @ManyToOne
    @JoinColumn(name = "ID")
    private CustomerBo customer;
}

如您所见,问题在于ID(不是S的PK)列确实引用了多个其他表的PrimaryKeys,我试图将它们分解为不同的实体。 另一方面,ContactPersonBo中的映射非常简单:

@Entity
public class ContactPersonBo{

    @OneToMany(mappedBy = "contactperson", cascade = CascadeType.ALL, targetEntity=A.class)
    private List<A> as;
...

现在,当我保留一个新的ContactPerson时,所有连接的实体都将按需要和预期保留。但是,如果我在spring-data-rest-repository上为ContactPerson调用delete,不仅所有A被删除,而且所有B都具有与A相同的ID,尽管我指定了targetEntity=A.class。我在休眠日志记录中看到,获取相关子集的公式确实被忽略,并且对该表上的delete调用了两次。 为了使外观更直观,表S如下所示:

   1    2    4      y          <- references table ContactPerson
   2    2    1      x          <- references some other table

我想删除ID = 2的ContactPerson,这也应该从PK = 1的S中删除条目,因为它的类型是S上与A匹配但不与B匹配的公式的一部分。但是PK的条目= 2也被删除。

这是一个复杂的设置,我希望我将其分解以清楚地说明问题,因为这是我在SO上的第一个问题。如果不是,请不要犹豫。

P.S .:我无法更改数据库的结构,我更喜欢在映射中修复此行为,而不是删除级联类型并通过“手动”删除这些条目。我还尝试在@DiscriminatorValueA上设置B,不影响任何东西,但是我很确定我是否使用普通的@DiscriminatorColumn还是可以的,但是不太方便因为types是一个很长的列表,并且涉及CDE

0 个答案:

没有答案