代码之家  ›  专栏  ›  技术社区  ›  en Peris

无法使用SpringBoot懒洋洋地初始化角色集合

  •  2
  • en Peris  · 技术社区  · 7 年前

    我有一个名为Company的域对象:

    @Entity
    @Table(name="t_company")
    public class Company implements Serializable {
    
        /**
         * 
         */
        private static final long serialVersionUID = 1L;
    
        public Company() {
        }
    
    
    
        /**
         * @param companyName
         */ 
        public Company(String companyName) {
            super();
            this.name = companyName;
        }
    
    
    
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        private Long id;
    
        @NotEmpty
        @Length(max = 100)
        private String name;
    
    
        @OneToMany(mappedBy = "company", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
        private Set<User> users = new HashSet<>();
    
    ..
    }
    

    存储库层:

    public interface CompanyRepository extends CrudRepository<Company, Long> {
    
        @Query("select co from Company co join co.users us where co = ?1")
        Company companyUsers (Company company);
    
    }
    

    @Service
    @Transactional(readOnly = true)
    public class CompanyService {
    
         @Autowired
         private CompanyRepository companyRepository;
    
         public Company companyUsers (Company company) {
            return companyRepository.companyUsers(company);
         }
    
    }
    

    Junit文件:

    @Test
        public void testCompanyUsers() throws Exception {
    
            Iterable<Company> companies = companyService.findAll();
            Company company = companies.iterator().next();
    
            assertNotNull (company);
    
            company = companyService.companyUsers(company);
            assertTrue (((Collection<?>) company.getUsers()).size() > 0);           
        }
    

    但是当我运行测试时,我会得到这个错误:

    未能惰性地初始化角色集合: com.cor.backend.persistence.domain.backend.Company.users,无法

    1 回复  |  直到 7 年前
        1
  •  3
  •   Arnold Galovics    7 年前

    请仔细阅读以下文章: https://blog.arnoldgalovics.com/2017/02/27/lazyinitializationexception-demystified/

    您的主要问题是试图访问事务外部的实体引用。

    • 在同一逻辑事务中获取必要的数据
    • 在JPQL查询中使用FETCH JOIN
    • 使用投影

    更多关于投影的阅读: https://blog.arnoldgalovics.com/2017/03/14/using-projections-in-your-data-access-layer/

    https://blog.arnoldgalovics.com/2017/07/10/how-much-projections-can-help/