Вы действительно пробовали свое последнее решение?
т.е. сделать обычное отображение JPA, а затем заставить получатель вернуть идентификатор, как это?
public ID getOtherObjId() {
return otherObj.getId();
}
На самом деле, есть большая вероятность, что это сработает даже после того, как вы выйдете за границы сеанса. Я не уверен, как это работает сегодня, но, по крайней мере, в какой-то более старой версии hibernate он поместит ленивый прокси в ссылку otherObj, когда загрузит вашу сущность, и этот ленивый прокси будет содержать идентификатор ссылочного объекта. Поэтому, когда вы обращаетесь только к идентификатору otherObj, он будет достаточно умен, чтобы не загружать объект.
Если это не работает, вы всегда можете принудительно загрузить objectRef.
Это немного дорого, но, возможно, оно того стоит.
(Кстати, если вы используете @OneToOne и nullable = true, он всегда будет загружать другую сторону с нетерпением. См. здесь (ищите «один к одному») для краткого объяснения)