我正在尝试建立一个没有具体鉴别符值的单表继承策略,因此在我的超类上使用@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 .:我无法更改数据库的结构,我更喜欢在映射中修复此行为,而不是删除级联类型并通过“手动”删除这些条目。我还尝试在@DiscriminatorValue
和A
上设置B
,不影响任何东西,但是我很确定我是否使用普通的@DiscriminatorColumn
还是可以的,但是不太方便因为types
是一个很长的列表,并且涉及C
,D
和E
。