[英]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.