В настоящее время я изучаю 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, что верно, но разве спящий режим не должен передавать вновь созданный идентификатор пользователя второму запросу?
Этот конкретный сценарий кажется мне очень нелогичным, поскольку я склонен передавать нулевой идентификатор объекту Permission, поскольку он новый, и я хочу, чтобы он был создан, но, с другой стороны, я должен установить свойство idModule, поскольку модуль уже существует, поэтому я не совсем понимаю, как должна работать такая операция.
Кто-нибудь знает, что я делаю неправильно? Спасибо