Идентификаторы недоступны из прокси-объекта - PullRequest
2 голосов
/ 11 января 2010

У меня есть следующий объект:

@Entity
@Table(name="slideshow")
@Searchable
public class SlideShow implements Serializable {

    @Id
    @GeneratedValue(generator="slideShowSeq")
    @SequenceGenerator(name="slideShowSeq", sequenceName="slideshow_seq")
    @SearchableId
    int slideShowId

    @SearchableProperty
    String name

    @ManyToOne
    @JoinColumn(name = "userid", referencedColumnName="userid")
    User user

    @ManyToOne
    @JoinColumn(name = "eventid")
    Event event
...
}

eventId и userId - это fks в таблице слайд-шоу. По умолчанию User и Event должны быть лениво загружены в SlideShow через прокси. Следовательно, я должен иметь возможность получать eventId и userId из slideShow.getEvent (). GetEventId (). Однако eventId равен нулю, когда я перехожу прокси-объект в отладчике. То же самое верно для идентификатора пользователя.

Кроме того, если доступны eventId и userId, если я добавлю

int eventId; 
String userId;

к классу. Но это как бы дублирует функцию гибернации, верно?

Я что-то упустил? Должен ли прокси-объект загружаться с идентификатором ассоциированного объекта? Как получить это? Спасибо за твою помощь.

Ответы [ 2 ]

1 голос
/ 11 января 2010

Если вы хотите зависеть от некоторых внутренних компонентов Hibernate, вы можете сделать что-то вроде:

if (event instanceof HibernateProxy) {
  eventId = ((HibernateProxy)event).getHibernateLazyInitializer().getIdentifier();
}
1 голос
/ 11 января 2010

Если Event и User загружаются лениво, то когда вы проходите через прокси в отладчике, тогда да, идентификаторы этих ссылочных объектов не будут там, потому что они еще не были загружены. Отладчики не будут запускать процесс загрузки, они просто проверяют содержимое прокси. Если вы покопаетесь с отладчиком в прокси, то, вероятно, где-то там найдете идентификатор, но это будет частью внутреннего представления Hibernate прокси-объекта.

Если вы на самом деле вызываете slideShow.getEvent().getEventId() программно, тогда должна быть запущена загрузка Event, и должен быть предоставлен идентификатор. Идентификатор обрабатывается так же, как и любое другое свойство в лениво загруженной сущности.

Нужен ли вам идентификатор ссылочной сущности до ее загрузки?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...