1. 程式人生 > >jpa如何懶加載大字段,懶加載之後又如何獲取懶加載字段

jpa如何懶加載大字段,懶加載之後又如何獲取懶加載字段

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; } public
String 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如何懶加載大字段,懶加載之後又如何獲取懶加載字段