6

I'm converting my entity to DTO and I want to set NULL as DTO value for all fields, which are lazy-loaded and not initialized (because I do not want to transfer all the data all the time).

I've tried:

if (!(entity.getNationality() instanceof HibernateProxy))
    this.setNationalityFromEntity(entity.getNationality());

But it did not seemed to help. Any suggestions are welcome!

Thank you!

4

3 回答 3

5

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

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

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

于 2014-05-14T04:30:09.367 回答
3

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

要确定它是否实际初始化,您需要询问它!

if (HibernateProxy.class.isInstance(entity.getNationality())) {
  HibernateProxy proxy = HibernateProxy.class.cast(entity.getNationality());
  if (!proxy.getHibernateLazyInitializer().isUninitialized()) {
    this.setNationalityFromEntity(entity.getNationality());
  }
}
于 2013-04-08T23:22:04.630 回答
0

在我看来,仅仅能够为某些不应该用于用例的状态调用 getter 的可能性是有问题的,但这是另一回事。我建议您实施适当的 DTO 方法以避免意外错误。

我为该用例创建了Blaze-Persistence 实体视图。您基本上将 JPA 实体的 DTO 定义为接口并将它们应用于查询。它支持映射嵌套的 DTO、集合等,基本上是您所期望的一切,最重要的是,它将提高您的查询性能,因为它会生成仅获取 DTO 实际需要的数据的查询。

您的示例的实体视图可能如下所示

@EntityView(Person.class)
interface PersonDto {
  String getNationality();
}

查询可能看起来像这样

List<PersonDto> dtos = entityViewManager.applySetting(
  EntityViewSetting.create(PersonDto.class),
  criteriaBuilderFactory.create(em, Person.class)
).getResultList();
于 2018-07-19T18:25:17.617 回答