zoukankan      html  css  js  c++  java
  • spring-data-jpa报错org.hibernate.LazyInitializationException

    spring-data-jpa启动报错:

    在使用spring-data-jpa单元测试时getOne()方法报错:

     是因为“懒加载”导致的。

    解决办法1:在实体类上添加注解:@Proxy(lazy = false),不使用懒加载

    package com.wn.domain;
    
    import org.hibernate.annotations.Proxy;
    
    import javax.persistence.*;
    
    @Entity
    @Table(name = "customer")
    @Proxy(lazy = false) // 不使用懒加载
    public class Customer {
    
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Column(name = "cust_id")
        private Long custId;
        @Column(name = "cust_name")
        private String custName;
        @Column(name = "cust_gender")
        private Boolean custGender;
        @Column(name = "cust_address")
        private String custAddress;
    }

    解决方法2:在测试方法上加@Transactional注解

        @Test
        public void testGetOne(){
            Customer customer = customerDao.getOne(1L);
            customer.setCustName("张三");
            customerDao.save(customer);
        }    

    解决方法3:使用findById()方法

        @Test
        public void testFindOne(){
            Customer customer = customerDao.findOne(1L);
            customer.setCustName("王五");
            customerDao.save(customer);
        }

    getOne()方法和findById()方法区别:

    首先要知道的时spring-data-jpa会帮我们生成dao层接口的代理对象,getOne()方法和findById()最终都会执行到org.springframework.data.jpa.repository.support.SimpleJpaRepository类中,由该类负责调用jpa原始的EntityManager对象的相关方法来执行;

    getOne()方法为延迟加载(懒加载),调用的是EntityManager对象的getReference()方法

    public T getOne(ID id) {
        Assert.notNull(id, "The given id must not be null!");
        return this.em.getReference(this.getDomainClass(), id);
    }

    findById()方法是立即加载,调用的EntityManager对象的find()方法

    public Optional<T> findById(ID id) {
        Assert.notNull(id, "The given id must not be null!");
        Class<T> domainType = this.getDomainClass();
        if (this.metadata == null) {
            // 调用find()方法
            return Optional.ofNullable(this.em.find(domainType, id));
        } else {
            LockModeType type = this.metadata.getLockModeType();
            Map<String, Object> hints = this.getQueryHints().withFetchGraphs(this.em).asMap();
            // 调用find()方法
            return Optional.ofNullable(type == null ? this.em.find(domainType, id, hints) : this.em.find(domainType, id, type, hints));
        }
    }
  • 相关阅读:
    产品生成器模块的问题图片处理
    jQueryinteface效果集合
    aspx页面中文汉字显示为乱码
    实用的正则表达式
    用javascript操作xml
    标注上下标的方法
    1740 博弈
    1028 母函数
    To resolve the problem of sharepoint can not login
    Modify Sharepoint Login UI
  • 原文地址:https://www.cnblogs.com/linyh99/p/14295431.html
Copyright © 2011-2022 走看看