Java getReference()和load()之间的差异

Java getReference()和load()之间的差异,java,hibernate,session,jpa,Java,Hibernate,Session,Jpa,在Hibernate 4.3中,load()fromsession返回延迟加载的代理对象,get()返回存在的对象,或者null返回不存在的对象。但是它提到,getReference()返回一个代理对象,load()返回一个带有初始化数据的对象。 在进一步的谷歌搜索中,我意识到这些方法来自IdentifierLoadAccess接口。所以我的问题是 这getReference()在功能上是否等于load()fromsession以及这load()是否等于get()fromsession 这个接口

在Hibernate 4.3中,
load()
from
session
返回延迟加载的代理对象,
get()
返回存在的对象,或者
null
返回不存在的对象。但是它提到,
getReference()
返回一个代理对象,
load()
返回一个带有初始化数据的对象。 在进一步的谷歌搜索中,我意识到这些方法来自IdentifierLoadAccess接口。所以我的问题是

  • getReference()
    在功能上是否等于
    load()
    fromsession以及这
    load()
    是否等于
    get()
    from
    session
  • 这个接口是JPA规范的一部分吗?还是从Hibernate本机API
  • 当会话接口中已经包含这些功能时,这些方法需要什么

  • IdentifierLoadAccess
    的包是
    org.hibernate
    。因此,它不是JPA规范的一部分。否则,它将位于
    javax.persistence

    IdentifierLoadAccess.getReference()
    正如示例所示,相当于
    EntityManager.getReference()
    ,也相当于旧的、名称不正确的
    Session.load()

    正如示例所示,
    IdentifierLoadAccess.load()
    相当于
    EntityManager.find()
    ,也相当于
    会话.get()

    据我所知,这个
    IdentifierLoadAccess
    接口及其包含的方法有助于在ID和简单自然ID(在较小程度上是自然ID)之间提供一致的加载/获取实体引用的方法。查看会话api文档中以
    by
    开头的所有方法

  • EntityManager#getReference()
    在功能上等同于
    session#load()
    。这可以通过hibernate的EntityManager实现(
    AbstractEntityManagerImpl
    )来验证,该实现将工作委托给会话加载()

    session#load()
    session#get()
    在行为上有些不同。详情请参阅

  • IdentifierLoadAccess
    位于包
    org.hibernate
    下。所以这就是Hibernate原生API。JPA规范定义的所有接口都在包
    javax.persistence

  • JPA是持久化的标准JavaAPI,这意味着如果您的应用程序只使用JPAAPI,理论上,它在不同的JPA提供者之间是可移植的。即使您更改为只使用其他JPA提供者而切换到其他JavaEE应用服务器,您的应用程序也可以工作


  • 谢谢你的回答。对第三个问题有什么想法吗?我修改了答案。