jpa如何懶加載大字段,懶加載之後又如何獲取懶加載字段
阿新 • • 發佈:2018-07-23
reat spa 16px lazy tor font nor nts 實現
前言:對於大字段,我們在查詢列表的時候不需要查詢,但是修改的時候有需要展示大字段內容,怎麽辦
問1.jpa如何懶加載大字段?即查詢列表的時候不查詢出來
問2.懶加載之後又如何獲取懶加載字段。比如,在後臺修改的實體的時候,需要展示內容,如何獲取detail內容(懶加載,它沒有加載)
1.jpa如何懶加載大字段?detail是我的大字段
@Entity
public class ParkDynamics extends TemporalEntity implements FieldHandled{},實現FieldHandled
具體實體代碼如下
@Entity public class ParkDynamics extends TemporalEntity implements FieldHandled {private String title; //標題 private String content; //內容 private String status; //狀態 (0:不可見;1:可見) private String remarks; //備註 private String creatorName; private String updatorName; @Lob @Basic(fetch = FetchType.LAZY) @Column(name="detail") private String detail;//圖文交替型內容(用文本編輯器)@OneToMany(mappedBy = "parkDynamics",fetch = FetchType.EAGER) private Set<ParkDynamicsFile> parkDynamicsFiles = new HashSet<>(); //公園動態文件 public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } publicString getContent() { return content; } public void setContent(String content) { this.content = content; } public String getRemarks() { return remarks; } public void setRemarks(String remarks) { this.remarks = remarks; } public String getCreatorName() { return creatorName; } public void setCreatorName(String creatorName) { this.creatorName = creatorName; } public String getUpdatorName() { return updatorName; } public void setUpdatorName(String updatorName) { this.updatorName = updatorName; } public String getStatus() { return status; } public void setStatus(String status) { this.status = status; } public Set<ParkDynamicsFile> getParkDynamicsFiles() { return parkDynamicsFiles; } public void setParkDynamicsFiles(Set<ParkDynamicsFile> parkDynamicsFiles) { this.parkDynamicsFiles = parkDynamicsFiles; } public String getDetail() { if (fieldHandler != null) { return (String) fieldHandler.readObject(this, "detail ", detail); } return null; } public void setDetail(String detail) { if(detail == null){ if(fieldHandler!=null){ fieldHandler.writeObject(this, "detail", this.detail, detail); return; } } this.detail = detail; } @Transient private FieldHandler fieldHandler;//用於延遲加載表字段,關聯對象延遲加載的話無需此技術 @JsonIgnore public FieldHandler getFieldHandler() { return fieldHandler; } public void setFieldHandler(FieldHandler fieldHandler) { this.fieldHandler = fieldHandler; } }
2.對於懶加載的字段,如何獲取其內容呢
關鍵代碼如下:(String) fieldHandler.readObject(this, "detail ", detail);,相當於去讀對象的detail屬性,然後會真是的加載detail的內容。this代表實體對象,這樣實體對象就detail就有內容了。
但是實際如果不是在一個事務中是不行的。也就是獲得實體和使實體去加載懶加載的字段不在同一個事務中,你執行(String) fieldHandler.readObject(this, "detail ", detail)是會報錯的。
也就有了如下的代碼,對需要獲取實體全部內容的getById和getByType進行了封裝,放在一個事務service類中
@Transactional @Service public class AnimalClassServiceImpl implements AnimalClassService{ @Autowired private AnimalClassRepository animalClassRepository; @Override public AnimalClass getById(Long id) { AnimalClass animalClass = animalClassRepository.getById(id); animalClass.setContent(null); return animalClass; } @Override public AnimalClass getFirstByType(String type) { AnimalClass animalClass = animalClassRepository.getFirstByType(type); animalClass.setContent(null); return animalClass; } }
jpa如何懶加載大字段,懶加載之後又如何獲取懶加載字段