Я пытаюсь настроить стратегию наследования одной таблицы, в которой у меня нет конкретных значений дискриминатора, поэтому при использовании @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;
}
Как видите,проблема в том, что столбец идентификатора (который не является PK of S) действительно ссылается на несколько других таблиц PrimaryKeys, которые я пытаюсь разбить на разные сущности.Сопоставление в ContactPersonBo на другой стороне довольно прямолинейно:
@Entity
public class ContactPersonBo{
@OneToMany(mappedBy = "contactperson", cascade = CascadeType.ALL, targetEntity=A.class)
private List<A> as;
...
Теперь, когда я сохраняю новый ContactPerson, все присоединенные объекты сохраняются в соответствии с требованиями и ожиданиями.Однако, если я вызову delete в моем spring-data-rest-repository для ContactPerson
, удаляются не только все A
s, но и все B
s, которые имеют такой же идентификатор, как A, хотя я указал targetEntity=A.class
,Я вижу в журнале гибернации, что формула для захвата соответствующего подмножества игнорируется, и удаление в этой таблице вызывается дважды.Чтобы сделать это немного более наглядным, таблица S выглядит следующим образом:
1 2 4 y <- references table ContactPerson
2 2 1 x <- references some other table
Я хочу удалить ContactPerson с ID = 2, это должно также удалить запись из S с PK = 1, потому чтоего тип является частью формулы на S, которая соответствует A, но не B. Однако запись с PK = 2 также удаляется.
Что ж, это сложная настройка, надеюсь, я разбил ее до состоянияпроблема довольно ясна, так как это мой первый вопрос здесь, на SO.Если не стесняйтесь спрашивать.
PS: Я не могу изменить структуру базы данных, и я бы предпочел исправить это поведение в отображении, а не удалять каскадные типы и удалять эти записи "вручную".Я также пытался установить @DiscriminatorValue
на A
и B
, это ни на что не влияет, но я почти уверен, что если я использую обычный @DiscriminatorColumn
, это будет работать, но довольно неудобно, поскольку types
- длинный списоки C
, D
и E
s участвуют.