Я сейчас изучаю Hibernate, и я наткнулся на эту проблему:
Я определил 3 объекта: Пользователь, Модуль, Разрешение. И пользователь, и модуль имеют отношение «один ко многим» с разрешением, поэтому составной идентификатор разрешения состоит из idUser и idModule. У пользовательского класса есть свойство, представляющее собой набор разрешений, и он соответствующим образом аннотируется с помощью @OneToMany, cascade = CascadeType.ALL и т. Д.
Теперь я сгенерировал классы с помощью функции обратного инжиниринга MyEclipse. Идентификатор разрешения был создан как отдельный класс, который имеет свойства idUser и idModule. Я думал, что смогу создать пользователя, добавить к нему несколько новых разрешений, и, таким образом, сохранение пользователя будет каскадно выполнять операцию, и разрешения будут сохраняться автоматически. Это верно, за исключением того, что операция вызывает исключение. Я запускаю следующий код:
Permission p = new Permission();
p.setId(new PermissionId(null, module.getId());
user.getPermissions().add(p);
session.save(user);
У меня проблема в том, что, хотя SQL генерируется правильно (сначала сохраняет пользователя, затем разрешения), я получаю сообщение об ошибке от драйвера базы данных (Firebird), в котором говорится, что он не может вставить нулевое значение для idUser, который имеет значение true, но не должен ли hibernate передавать вновь созданный идентификатор пользователя во второй запрос?
Этот конкретный сценарий кажется мне очень нелогичным, поскольку я склонен передавать нулевой идентификатор объекту Permission, поскольку он новый, и я хочу, чтобы он был создан, но с другой стороны, я должен установить idModule свойство, поскольку модуль уже существует, поэтому я не совсем понимаю, как должна работать такая операция.
Кто-нибудь знает, что я делаю не так? Спасибо