DiscriminatorFormula выполняется при выборе, но не при удалении - PullRequest
0 голосов
/ 09 апреля 2019

Я пытаюсь настроить стратегию наследования одной таблицы, в которой у меня нет конкретных значений дискриминатора, поэтому при использовании @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 участвуют.

...