Не может использовать генерацию ключей столбца идентификационных данных с <подклассом объединения> (TABLE_PER_CLASS)

Этот вопрос старый, но я думаю, что более ясное объяснение состоит в том, чтобы вызвать принцип подстановки Лискова: все, что верно в отношении суперкласса, должно быть верным для всех его подклассов. Вы должны иметь возможность делать с SubFoo все, что вы можете делать с Foo, а может и больше.

Предположим, у нас есть Calico & lt ;: Cat & lt ;: Animal, а Husky & lt ;: Dog & lt ;: Animal. Давайте посмотрим на Function[Cat, Dog]. Какие утверждения правдивы по этому поводу? Их два:

(1) Вы можете передать любой Cat (так, любой подкласс Cat)

(2) Вы можете вызвать любой метод Dog для возвращаемого значения

Так что Function[Calico, Dog] <: Function[Cat, Dog] имеет смысл? Нет, операторы, которые являются истинными для суперкласса, не являются истинными для подкласса, а именно, оператор (1). Вы не можете передать ни одного кота в функцию, которая берет только кошек Калико.

Но имеет ли Function[Animal, Dog] <: Function[Cat, Dog] смысл? Да, все утверждения о суперклассе верны для подкласса. Я все еще могу передать любой Cat - фактически я могу сделать даже больше, я могу передать любой Animal - и я могу вызвать все методы Dog для возвращаемого значения.

Итак, A <: B подразумевает Function[B, _] <: Function[A, _]

Теперь, имеет ли Function[Cat, Husky] <: Function[Cat, Dog] смысл? Да, все утверждения о суперклассе верны для подкласса; Я все еще могу передать Cat, и я все еще могу вызывать все методы Dog для возвращаемого значения - на самом деле я могу сделать даже больше, я могу вызвать все методы Husky для возвращаемого значения.

Но имеет ли Function[Cat, Animal] <: Function[Cat, Dog] смысл? Нет, утверждения, которые являются истинными для суперкласса, не являются истинными для подкласса, а именно утверждения (2). Я не могу вызвать все методы, доступные в Dog для возвращаемого значения, только те, которые доступны в Animal.

Таким образом, с помощью Function[Animal, Husky] я могу делать все, что могу, с помощью Function[Cat, Dog]: я могу передать любой Cat, и я могу вызвать все методы Dog для возвращаемого значения. И я могу сделать еще больше: я могу перейти на других животных, и я могу вызвать методы, доступные на Husky, которые не доступны на Dog. Так что имеет смысл: Function[Animal, Husky] <: Function[Cat, Dog]. Первый параметр типа может быть заменен суперклассом, второй - подклассом.

88
задан Martijn Pieters 17 November 2017 в 08:41
поделиться

1 ответ

Проблема здесь в том, что вы смешиваете наследование «таблица на класс» и GenerationType.Auto . Рассмотрим столбец идентичности в MsSQL. Он основан на столбцах. В стратегии «таблица на класс» вы используете одну таблицу на класс, и каждая из них имеет идентификатор.

Попробуйте:

@GeneratedValue (strategy = GenerationType.TABLE)

212
ответ дан 24 November 2019 в 07:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: