我有以下对象:
@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。因此,我应该能够从slideShow.getEvent()获取eventId和userId.getEventId()但是,当我在调试器中单步执行代理对象时,eventId为null。 userId也是如此。
此外,如果我添加
,则eventId和userId可用int eventId;
String userId;
上课。但这有点复制hibernate的功能,对吗?
我错过了什么吗?代理对象是否应该懒惰地加载关联对象的id?如何检索它?谢谢你的帮助。
答案 0 :(得分:1)
如果懒惰地加载Event
和User
,那么当您在调试器中单步执行代理时,则是,那些引用的对象的ID将不会存在,因为它们还没有装了。调试器不会触发加载过程,它们只是检查代理的内容。如果你在代理中充分利用调试器,你可能会在某处找到ID,但它将成为Hibernate代理对象内部表示的一部分。
如果您实际以编程方式调用slideShow.getEvent().getEventId()
,则应触发Event
加载,并使ID可用。 ID被视为与延迟加载的实体中的任何其他属性一样。
在加载之前,您确实需要引用实体的ID吗?
答案 1 :(得分:1)
如果您愿意依赖某些Hibernate内部,您可以执行以下操作:
if (event instanceof HibernateProxy) {
eventId = ((HibernateProxy)event).getHibernateLazyInitializer().getIdentifier();
}