zoukankan      html  css  js  c++  java
  • 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;
    	}
    
    }
    

      

  • 相关阅读:
    SD卡测试
    测试人员可能会遇到的问题
    HDU 1024 Max Sum Plus Plus
    HDU 1176 免费馅饼
    HDU 1257 最少拦截系统
    HDU 1087 Super Jumping! Jumping! Jumping!
    poj 1328 Radar Installation
    poj 1753 Flip Game
    HDU 1003 Max Sum
    HDU 5592 ZYB's Premutation(BestCoder Round #65 C)
  • 原文地址:https://www.cnblogs.com/longsanshi/p/9353736.html
Copyright © 2011-2022 走看看