Неверное отображение между таблицами отца и ребенка - PullRequest
1 голос
/ 05 марта 2020

Я пытаюсь смоделировать отношения Отец / Дети в Spring Data JDB C (версия 1.1.5.RELEASE). Пока мне удалось заставить работать операцию вставки, но я столкнулся с ошибкой при чтении данных.

Объекты выглядят так

@Table("FATHER")
data class FatherDao(
    @Id
    val id: Long?, 
    @MappedCollection(idColumn="father_id")
    val childrens: Set<ChildrenDao>
)
@Table("CHILDREN")
data class ChildrenDao(
    @Id 
    val id: Long?,
    val father: FatherDao?
)

Схема следующее:

CREATE TABLE father (
   id INT GENERATED BY DEFAULT AS IDENTITY(START WITH 1, INCREMENT BY 1)
   PRIMARY KEY (id)
);

CREATE TABLE children (
    id INT GENERATED BY DEFAULT AS IDENTITY(START WITH 1, INCREMENT BY 1),
    father_id INT
    PRIMARY KEY (id)
);

На данный момент я опустил внешний ключ на character_id.

Репозиторий просто

@Repository
interface FatherRepository : CrudRepository<CharacterDao, Long>

Для сохранения дочерних объектов, связанных с отец, я не вызываю ChildrenRepository, но вместо этого продолжаю сохранять сущность отца.

Создание проходит гладко, но когда я пытаюсь получить созданную сущность, я получаю следующее исключение

user lacks privilege or object not found: FATHER.CHILDREN_DAO in statement [SELECT CHILDREN.id AS id, father.id AS father_id FROM CHILDREN LEFT OUTER JOIN FATHER AS father ON father.children_dao = CHILDREN.id WHERE CHILDREN.father_id = ?]

Моя главная проблема в том, что я не могу понять, откуда взялся FATHER.CHILDREN_DAO. Я вполне уверен, что это вызвано плохим отображением в сущности FatherDao, но даже глядя на Spring Data JDB C docs относительно наборов, я не могу найти подсказку.

1 Ответ

1 голос
/ 06 марта 2020

Вы, кажется, пытаетесь создать двунаправленную связь между FatherDao и ChildrenDao. Это не поддерживается Spring Data JDB C. Два соединения считаются независимыми, и Spring Data JDB C пытается загрузить отца, на которого ссылаются дети, что в соответствии с правилами отображения потребует CHILDREN_DAO для отца.

Существует два варианта решения. проблема в зависимости от вашего домена. Важный вопрос: являются ли дети частью совокупности отца или сами являются совокупностью?

Если дети являются частью совокупности отца , либо удалите ссылку father, либо пометьте его @Transient. В последнем случае вы можете установить значение в конструкторе FatherDao или в AfterLoadCallback

Если потомков являются их собственной совокупностью и childrens и ссылка father должна быть удалена, и вместо этого следует использовать идентификатор (или набор сущностей, содержащих идентификатор). Вместо двунаправленной связи у вас будет метод запроса для загрузки отца ребенка или наоборот.

Артикул Spring Data JDB C, Ссылки и агрегаты объясняет обоснование этого проектного решения, а также содержит пример того, как его реализовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...