Я нашел проблему. Это немного странно. Класс DAO, который я использовал, имел аннотацию уровня класса:
@Transactional(readOnly=true)
Сгенерированный sql был
Hibernate: insert into CAMERAS (CAMERA_BRAND) values (?)
Hibernate: insert into LENSES (LENS_NAME) values (?)
Hibernate: insert into LENSES (LENS_NAME) values (?)
И все же он сохранил 2 объекта, но не сохранил и не вставил данные в таблицу соединений.
В тот момент, когда я добавил аннотацию уровня метода:
@Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW)
все оказалось хорошо, и данные действительно были вставлены в таблицу соединений. Новые SQL, сгенерированные в этом случае, были ...
Hibernate: insert into CAMERAS (CAMERA_BRAND) values (?)
Hibernate: insert into LENSES (LENS_NAME) values (?)
Hibernate: insert into LENSES (LENS_NAME) values (?)
Hibernate: insert into CAMERAS_LENSES (CAM_ID, LENS_ID) values (?, ?)
Hibernate: insert into CAMERAS_LENSES (CAM_ID, LENS_ID) values (?, ?)
Довольно странно, что ни одна стратегия распространения транзакций не сохранила данные в 2 таблицы, но как только была дана стратегия распространения, все оказалось в порядке.
Другое интересное наблюдение состоит в том, что я попытался поместить стратегию распространения как ОБЯЗАТЕЛЬНУЮ на уровне метода (чтобы проверить, существует ли Транзакция, которая привела к первому и ошибочному случаю), однако метод вызвал исключение, указывающее на отсутствие транзакции, все же данные были сохранены в 2 таблицы.
Надеюсь, это поможет кому-то дальше ...