Hibernate 无法使用SpringBoot延迟初始化角色集合

Hibernate 无法使用SpringBoot延迟初始化角色集合,hibernate,spring-mvc,spring-boot,junit,spring-data-jpa,Hibernate,Spring Mvc,Spring Boot,Junit,Spring Data Jpa,我有一个基本的SpringBoot 2.0.3.RELEASE应用程序,它使用Spring初始值设定项、JPA、嵌入式Tomcat、Thymeleaf模板引擎和包作为可执行的JAR文件,并在pom.xml中包含这些依赖项 我有一个名为Company的域对象: @Entity @Table(name="t_company") public class Company implements Serializable { /** * */ private sta

我有一个基本的SpringBoot 2.0.3.RELEASE应用程序,它使用Spring初始值设定项、JPA、嵌入式Tomcat、Thymeleaf模板引擎和包作为可执行的JAR文件,并在pom.xml中包含这些依赖项

我有一个名为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<>();

..
}
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);           
    }
@测试
public void testCompanyUsers()引发异常{
Iterable companies=companyService.findAll();
Company=companys.iterator().next();
资产(公司);
公司=公司服务。公司用户(公司);
assertTrue(((集合)company.getUsers()).size()>0);
}
但是当我运行测试时,我得到了以下错误:

未能延迟初始化角色集合: 未能找到com.cor.backend.persistence.domain.backend.Company.users 初始化代理-无会话


请仔细阅读以下文章:

您的主要问题是,您试图访问事务外部的实体引用。 这里有多个选项:

  • 在同一逻辑事务中获取必要的数据
  • 在JPQL查询中使用fetchjoin
  • 使用投影
更多关于预测的阅读:


还考虑使用投影的性能影响: 的Spring Bug,我们需要添加<代码> @事务性< /代码>(org .prgFrrask.Trase.注释.事务性) 到我们使用lazy loaded属性的类:

testCompanyUsers()

i、 e

@Service
@Transactional(readOnly = true)
public class CompanyService {

     @Autowired
     private CompanyRepository companyRepository;

     public Company companyUsers (Company company) {
        return companyRepository.companyUsers(company);
     }

}
@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);           
    }
import org.springframework.transaction.annotation.Transactional;

...
@Transactional
public void testCompanyUsers() throws Exception {
...