Java/Hibernate:如何检测字段是否是延迟加载的代理而不是实际数据?

Mir*_*dak 6 java hibernate lazy-loading dto

我正在将我的实体转换为 DTO,并且我想将 NULL 设置为所有字段的 DTO 值,这些字段是延迟加载且未初始化的(因为我不想一直传输所有数据)。

我试过了:

if (!(entity.getNationality() instanceof HibernateProxy))
    this.setNationalityFromEntity(entity.getNationality());
Run Code Online (Sandbox Code Playgroud)

但它似乎没有帮助。欢迎任何建议!

谢谢!

Aff*_*ffe 5

该类始终是一个代理,无论它是否已初始化,因此如果您只检查代理的实例,则每次都将排除它。延迟加载不会导致实体上的代理引用被替换为对新对象的引用,它只是填充字段。

要了解它是否确实已初始化,您需要询问它!

if (HibernateProxy.class.isInstance(entity.getNationality())) {
  HibernateProxy proxy = HibernateProxy.class.cast(entity.getNationality());
  if (!proxy.getHibernateLazyInitializer().isUninitialized()) {
    this.setNationalityFromEntity(entity.getNationality());
  }
}
Run Code Online (Sandbox Code Playgroud)


Dun*_*ear 5

我们在实体中这样做的方式是我们有布尔方法,它们以不会触发延迟加载的方式进行检查。例如,如果我们的实体有一个名为“关联的东西”的关联实体,那么检查关联实体是否已延迟加载的方法将是:

    public boolean isAssociatedSomethingLoaded() {
        if (associatedSomething instanceof HibernateProxy) {
            if (((HibernateProxy)associatedSomething).getHibernateLazyInitializer().isUninitialized()) {
                return false;
            }
        }
        return (getAssociatedSomething() != null);
    }
Run Code Online (Sandbox Code Playgroud)

注意:重要的是不要getAssociatedSomething()在检查中使用,因为这可以确保关联的实体在检查期间不会被延迟加载。