(отредактировано на основе сопоставлений / запросов SQL / примеров данных, размещенных в вопросе / комментариях).
Ваше сопоставление указывает, что FruitBowl
содержит коллекцию Apple
с. Поэтому Hibernate не будет добавлять условие значения дискриминатора к запросу загрузчика для этой коллекции, поскольку заранее знает, что могут быть возвращены только Apple
экземпляров.
Запросы SQL, которые вы отправили, делают именно это - загружают FruitBowl
по идентификатору и затем загружают apples
коллекцию для этого FruitBowl
экземпляра. Проблема связана с данными, которые вы разместили:
fruit_type entity_id pos color
A 1 1 white
B 1 2 blue
Есть еще один экземпляр Fruit
со значением дискриминатора B
- Banana
? :-) - имеет тот же entity_id
и, таким образом, извлекается как часть запроса на загрузку коллекции. Вопрос здесь - как это было вставлено во-первых? Есть два возможных сценария:
Banana
является подклассом Apple
. В этом случае все правильно, он должен быть возвращен как часть apples
collection.
- Вы вставили вышеуказанные данные вручную для целей тестирования. Эти данные являются недопустимыми с точки зрения Hibernate - они будут вставлены НИКОГДА самой Hibernate; это в свою очередь приводит к поведению, которое вы видите. Вам нужно либо избавиться от строки
Banana
, либо удалить ее entity_id
(тем самым удалив ее из коллекции apples
).
Вообще говоря, смешивать иерархию объектов и элементы коллекции в одной таблице не очень хорошая идея. Попробуйте переопределить иерархию как «таблица на подкласс» или сопоставить коллекцию apples
с использованием @JoinTable
- обратите внимание, что в последнем случае она станет однонаправленной.