一尘不染

JPA 2.0 / Hibernate:为什么开箱即用“ @OneToOne”进行LAZY提取?

hibernate

我的问题是关于具有Hibernate,@ OneToOne关系和延迟加载的JPA 2.0。

首先我的设置:

  • Spring 3.0.5。发布
  • SprnigData JPA 1.0.1.RELEASE
  • hibernate3.5.2-最终
  • DBMS:PostgreSQL 9.0

最近,我遇到了一个事实,即@OneToOne关系不能以惰性方式(FetchType.LAZY)来获取,至少没有字节码检测,编译时间编织等。许多网站都这样说,例如:

事情是,在我的设置中,@ OneToOne实体的延迟加载似乎可以“即开即用”地工作,我真的很想知道为什么。请看看我的单元测试:

@Test
@Transactional
public void testAvatarImageLazyFetching()
{
    User user = new User();
    user.setAvatarImage( new AvatarImage() );

    User = userRepository.save( user );

    entityManager.flush();
    entityManager.clear();

    User loadedUser = userRepository.findOne( user.getId() );
    assertNotNull( loadedUser );

    PersistenceUtil persistenceUtil = Persistence.getPersistenceUtil();

    assertTrue( persistenceUtil.isLoaded( loadedUser ) );
    assertFalse( persistenceUtil.isLoaded( loadedUser, "avatarImage" ) );
}

这个测试用例是成功的,并且在Hibernates SQL日志记录输出中,我可以清楚地看到,“ avatarImage”将不会被提取,只是“
user”(仅一个SELECT,没有JOIN,无法访问“ AvatarImage”表)等等。)

User类中的单向@OneToOne关系商店如下所示:

@OneToOne( cascade = CascadeType.ALL, fetch = FetchType.LAZY )
private AvatarImage    avatarImage;

因此,一切都很简单-似乎可行。

再说一遍我的问题:为什么它起作用,为什么尽管用@OneToOne关联引用了“ AvatarImage”?

我非常感谢您可以提供的任何帮助

非常感谢!


阅读 510

收藏
2020-06-20

共1个答案

一尘不染

延迟加载OneToOne关系的问题仅在关系的相反部分(用mappingBy属性标记的关系)上。在关系的拥有方面,它工作正常。两者之间的区别在数据库级别很明显。在您的情况下,问题是User数据库表是否将AvatarImage的ID作为列之一或相反。如果User表的ID为AvatarImage的列,则延迟加载将按照您说的“即开即用”的方式工作,但反之则不起作用。

2020-06-20