簡體   English   中英

Java / Hibernate:如何檢測,如果字段是延遲加載的代理而不是實際數據?

[英]Java/Hibernate: How to detect, if field is lazy-loaded proxy and not actual data?

我正在將我的實體轉換為DTO,我想為所有字段設置NULL作為DTO值,這些字段是延遲加載但未初始化(因為我不想一直傳輸所有數據)。

我試過了:

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

但它似乎沒有幫助。 歡迎任何建議!

謝謝!

我們在實體中這樣做是因為我們有布爾方法,它們以不會觸發延遲加載的方式進行檢查。 例如,如果我們的實體有一個名為'associatedSomething'的關聯實體,那么檢查該關聯實體是否已延遲加載的方法將是:

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

注意:重要的是不要在檢查中使用getAssociatedSomething() ,因為這可以確保關聯的實體在檢查期間不會延遲加載。

該類始終是一個代理,無論它是否已初始化,因此如果您只檢查代理實例,則每次都要排除它。 延遲加載不會導致實體上的代理參考被替換為對新對象的引用,它只是填充字段。

要了解它是否實際初始化,您需要問它!

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

在我看來,僅僅為一個用例調用一個不應該用於某個用例狀態的getter的可能性是有問題的,但這是一個不同的故事。 我建議您實施適當的DTO方法,以避免意外錯誤。

我為這個用例創建了Blaze-Persistence Entity Views 您實際上將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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM