Гибернация со сложными отношениями и внешними ключами делает загрузку / сохранение АД - PullRequest
0 голосов
/ 20 января 2012

Я довольно новичок в Hibernate, и у меня возникает проблема с огромными головными болями:

У меня есть база данных, использующая отношения с внешними ключами.Сначала я создал свою базу данных со всеми ссылками, представленными в MySQL InnoDB.Затем я сгенерировал из MySQL Workbench все модели из базы данных.Выглядело это очень красиво и удобно.

Получить пользователей и их детей очень легко и быстро;НО добавление записи становится ужасным, мне нужно загрузить все родительские элементы нового объекта, чтобы иметь возможность сохранить его из-за "org.hibernate.PropertyValueException: not-null свойство ссылается на нулевое или временное значение ...".

Моя схема вполне нормальная, у пользователя много фотографий, у фотографий есть капли и форматы, у пользователя много избранных и т. Д. Поэтому, когда я хочу вставить новую фотографию, мне нужно создать ОГРОМНОЕ количествосвязанный объект, который действительно раздражает и является сложным, по сравнению с использованием простого SQL-запроса с вставкой индексов, таких как user_id:15, но при выборе записи, получающей пользовательский объект.

Интересно, каков хороший способ создания сложных отношенийбазы данных, при получении объекта вы загрузили в качестве объектов его объекты, подобные этим:

(User Object)
{
    firstname="John",
    lastname="Doe",
    ...
    photos:[
    {
        format:"jpg",
        url:"http://wifhwofihwofihwf.com",
        ...   
    }],
    favorites:[
    { (user Object)
         firstname:"Steve",
         lastname :"Doe",...
         photos:[...]
    },...
    ]
}

И как можно определить глубину требуемого ответа при получении пользователя, потому что мы чего-то не хотимнапример:

(User Object)
    {
        ...
        favorites:[
        { (user Object)
             firstname:"Steve",
             lastname :"Doe",...
             photos:[...],
              {
                  ...
                  favorites:[
                  {
                            ...
                            favorites:[
                            {
                                 LOOONG DEPTH
                            },...
                            ]
                  },...
                  ]
    }

если у вас есть ссылки или советы о том, как справиться с этим, я был бы благодарен,потому что я могу найти только очень глупые примеры спящего режима, которые не работают в моем случае.

Приветствия!

1 Ответ

1 голос
/ 20 января 2012

Не ищите примеров.Прочитайте справочное руководство .

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

@ManyToOne(lazy = true)
private User owner;

Чтобы сохранить новую фотографию, если эта новая фотография принадлежит пользователю, вам просто нужно получить ссылку на этого пользователя.Нет необходимости загружать фотографии этого пользователя или любые другие косвенные зависимости.И вам даже не нужно обращаться к базе данных:

Photo photo = new Photo();
photo.setOwner((User) session.load(User.class, userId));
session.persist(photo);

Я не понимаю, как это так сложно.Возможно, вам стоит привести пример кода, сохраняющего новую фотографию.

...