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

      

  • 相关阅读:
    《软件测试》实验
    作业5
    之前看构建之法老段让我写的随笔
    作业2
    Bookstore系统测试缺陷报告
    实验七——Web应用测试(bookstore项目上完成)
    《构建之法》读后感
    (1)写一个程序,用于分析一个字符串中各个单词出现的频率,并将单词和它出现的频率输出显示。(单词之间用空格隔开,如“Hello World My First Unit Test”); (2)编写单元测试进行测试; (3)用ElcEmma查看代码覆盖率,要求覆盖率达到100%。
    个人简介
    (1)把一个英语句子中的单词次序颠倒后输出。例如输入“how are you”,输出“you are how”; (2)编写单元测试进行测试; (3)用ElcEmma查看代码覆盖率,要求覆盖率达到100%。
  • 原文地址:https://www.cnblogs.com/longsanshi/p/9353736.html
Copyright © 2020-2023  润新知