我有這個物件:
物體
@Entity
public class someClass{
private String name;
private String labelKey;
@ManyToMany(cascade = {CascadeType.PERSIST,CascadeType.MERGE}, fetch = FetchType.LAZY)
private Set<Product> products = new HashSet<>();
}
DTO
public class someClass{
private String name;
private String labelKey;
private Set<Product> products = new HashSet<>();
}
我的問題是,當我得到這個物件但產品被延遲初始化時,當我使用 Dozer 將物體映射到 DTO 時,我得到一個 LaziInitializedException,然后我想得到那個當我得到產品延遲初始化時,這個產品將回傳一個 empry Set。這可能嗎?
謝謝你的時間,對不起我的英語,這不是我的母語。
uj5u.com熱心網友回復:
正如您在本教程中所見,您可以指示dozer從映射中排除某些欄位。
如果這樣做,那么推土機將不會呼叫getProducts物體類的方法,因此LaziInitializedException不會拋出例外。
同時,因為您的 DTO 物件HashSet在欄位 products 中初始化為空,所以這將保留在 DTO 的末尾。
因此,您的要求將起作用,您的物體為產品延遲初始化,您的 DTO 回傳一個空串列,同時映射從dozer.
這是您的映射器所需的配置dozer。
BeanMappingBuilder mappingExclusion = new BeanMappingBuilder() {
@Override
protected void configure() {
mapping(SomeClassEntity.class, SomeClassDto.class).exclude("products");
}
};
mapper = new DozerBeanMapper();
mapper.addMapping(mappingExclusion);
然后你可以用它來做如下映射
mapper.map(someClassEntityInstance, someClassDtoInstance);
uj5u.com熱心網友回復:
您可以創建/修改您的 Getter,以便:
public Set<Product> getProducts() {
if (products == null) {
return new HashSet<>();
//or products = new HashSet<>(), but I'm not sure of the side effects as far as database framework is concerned.
}
return products;
}
uj5u.com熱心網友回復:
嘗試將您的服務類或方法標記為 @Transactional 以讓 Spring 處理會話管理。
public class ServiceUsingSomeClass {
final SomeClassRepository someClassRepository;
//Constructor ...
@Transactional
showProducts() {
someClassRepository.findAll();
// Do something with Set<Product>
}
}
uj5u.com熱心網友回復:
如果您只想避免在使用 Dozer 進行 DTO 映射的情況下獲取關聯,則可以products通過擴展DozerConverter和使用該自定義轉換器將其配置為忽略源物件中的欄位。
我也覺得這可能意味著您的目標型別實際上并不需要以products欄位開頭,因為您不會填充它。
如果您的代碼庫中有很多這樣的地方,請考慮使用投影來僅獲取手頭目的所需的屬性。
@fella7ena 提出了一個關于 @Transactional 的觀點,但這實際上是無關的——你仍然可以在事務中遇到 LazyInitializationException。發生這種情況是因為 Hibernate 失去了對 Java bean 的持久性狀態和資料庫狀態之間關系的跟蹤。如果您真的想products從資料庫中獲取關聯,則必須使用 eager fetchtype(導致 n 1 問題)、批處理或物體圖。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/481184.html
下一篇:SpringJPA引數值[1000]與預期型別不匹配[ma.mycom.myapp.domain.Client(n/a)]
