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


前言:對於大字段,我們在查詢列表的時候不需要查詢,但是修改的時候有需要展示大字段內容,怎么辦

問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;
	}

}

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM