代理对象无法使用ID

时间:2010-01-10 22:51:51

标签: java hibernate

我有以下对象:

@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?如何检索它?谢谢你的帮助。

2 个答案:

答案 0 :(得分:1)

如果懒惰地加载EventUser,那么当您在调试器中单步执行代理时,则是,那些引用的对象的ID将不会存在,因为它们还没有装了。调试器不会触发加载过程,它们只是检查代理的内容。如果你在代理中充分利用调试器,你可能会在某处找到ID,但它将成为Hibernate代理对象内部表示的一部分。

如果您实际以编程方式调用slideShow.getEvent().getEventId(),则应触发Event加载,并使ID可用。 ID被视为与延迟加载的实体中的任何其他属性一样。

在加载之前,您确实需要引用实体的ID吗?

答案 1 :(得分:1)

如果您愿意依赖某些Hibernate内部,您可以执行以下操作:

if (event instanceof HibernateProxy) {
  eventId = ((HibernateProxy)event).getHibernateLazyInitializer().getIdentifier();
}