有效地确定通过OneToMany关系引用的实体的ID

Thi*_*kel 6 java hibernate

假设我有一个Hibernate实体,声明OneToMany与不同实体的关系:

@Entity
public class SomeEntity {
  @OneToMany(fetch = FetchType.LAZY)
  private List<OtherEntity> otherEntities = new LinkedList<OtherEntity>();

  [...]
}
Run Code Online (Sandbox Code Playgroud)

映射SomeEntity到相应的DTO时,我需要的只是标识OtherEntity为主键的ID (即,我实际上并不感兴趣OtherEntity).

Hibernate是否支持这种模式,即只检索通过OneToMany关系引用的实体的ID ?

我无法影响SomeEntity检索的方式(即,我SomeEntity在当前Hibernate会话的范围内检索到现有实例),但我们假设尚未进行延迟加载,因此只需检索子对象的ID(而不是完整的实际上会产生性能优势.

Pio*_*cki 0

您可以尝试在不访问实体本身的情况下获取主键(不带otherEntities.get(0).getId())。为此,您可以使用该类PersistenceUnitUtil

PersistenceUnitUtil#getIdentifier(yourEntity)

可以PersistenceUnitUtil从 中获得EntityManagerFactory。所以它可能是这样的:

EntityManager em = ...  
PersistenceUnitUtil = em.getEntityManagerFactory().getPersistenceUnitUtil();
Run Code Online (Sandbox Code Playgroud)

不幸的是,我不知道这是否会阻止实体加载的发生。然而,仅仅访问otherEntities集合甚至获取每个实体的引用并不会使实例被加载;您需要在获取的实体上调用一个方法以确保它将被加载。

您还可以考虑创建@NamedQuery并仅返回OtherEntityID。

哈!