Spring引导中的java延迟加载
我有两个实体,我使用多对多关系将它们连接起来
package com.app.mms.entity;
import ...
@Entity
@Table(name = "insurance_company")
public class InsuranceCompany{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@Column(name = "name")
private String name;
@ManyToMany(fetch = FetchType.LAZY,
cascade = {CascadeType.DETACH, CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH})
@JoinTable(name = "insurance_survey",
joinColumns = { @JoinColumn(name = "id_insurance_company") },
inverseJoinColumns = { @JoinColumn(name = "id_survey_company") })
private List<SurveyCompany> surveyCompany;
// Getters, setters and constructor
}
及
package com.app.mms.entity;
import ...
@Entity
@Table(name = "survey_company")
public class SurveyCompany{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@Column(name = "name")
private String name;
@ManyToMany(fetch = FetchType.LAZY,
cascade = {CascadeType.DETACH, CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH})
@JoinTable(name = "insurance_survey",
joinColumns = { @JoinColumn(name = "id_survey_company") },
inverseJoinColumns = { @JoinColumn(name = "id_insurance_company") })
private List<InsuranceCompany> insuranceCompany;
// Getters, setters and constructor
}
并有2名Jpa回购人:
package com.app.mms.dao;
import ...
@Repository
public interface InsuranceCompanyDao extends JpaRepository<InsuranceCompany, Long>{
}
package com.app.mms.dao;
import ...
@Repository
public interface SurveyCompanyDao extends JpaRepository<SurveyCompany, Long>{
}
还有我的应用程序。属性包含:
spring.datasource.url=jdbc:h2:file:./Database/mmsdb;DB_CLOSE_ON_EXIT=FALSE
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=mms
spring.datasource.password=mms
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.jpa.hibernate.ddl-auto=update
spring.h2.console.enabled=true
我试图懒洋洋地检索实体,但我遇到了一个异常:
System.out.println("All Survey companies:");
System.out.println(surveyCompanyDao.findAll());
System.out.println("All Insurance companies:");
System.out.println(insuranceCompanyDao.findAll());
// I imagine, after calling findAll() the session is already closed,
//and then I try to retrieve the insurance company for that survey company because of lazy, and I get exception.
System.out.println(insuranceCompanyDao.findAll().get(0).getSurveyCompany());
例外情况是:
Caused by: org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.app.mms.entity.InsuranceCompany.surveyCompany, could not initialize proxy - no Session
at org.hibernate.collection.internal.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:602) ~[hibernate-core-5.3.9.Final.jar:5.3.9.Final]
at org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:217) ~[hibernate-core-5.3.9.Final.jar:5.3.9.Final]
at org.hibernate.collection.internal.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:581) ~[hibernate-core-5.3.9.Final.jar:5.3.9.Final]
at org.hibernate.collection.internal.AbstractPersistentCollection.read(AbstractPersistentCollection.java:148) ~[hibernate-core-5.3.9.Final.jar:5.3.9.Final]
at org.hibernate.collection.internal.PersistentBag.toString(PersistentBag.java:537) ~[hibernate-core-5.3.9.Final.jar:5.3.9.Final]
at java.lang.String.valueOf(String.java:2994) ~[na:1.8.0_112]
at java.io.PrintStream.println(PrintStream.java:821) ~[na:1.8.0_112]
at com.app.mms.MmsApplication.run(MmsApplication.java:63) [classes/:na]
at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:813) [spring-boot-2.1.4.RELEASE.jar:2.1.4.RELEASE]
... 10 common frames omitted
如何在Spring boot中懒洋洋地检索数据?我找到了一些解决方案,其中他们再次初始化会话(spring boot在存储库中默认提供)。我不太确定这样做是否正确,因为我对SpringBoot很陌生。如果有人能解释一下在spring boot中懒洋洋地检索数据的正确方法,那就太好了
编辑:
我的主课:
package com.app.mms;
import ...
@SpringBootApplication
public class MmsApplication implements CommandLineRunner{
@Autowired
InsuranceCompanyDao insuranceCompanyDao;
@Autowired
SurveyCompanyDao surveyCompanyDao;
@Autowired
InsuranceCompanyService service;
public static void main(String[] args) {
SpringApplication.run(MmsApplication.class, args);
}
@Override
public void run(String... strings) throws Exception {
System.out.println("In command line runner...");
System.out.println("All Survey companies:");
System.out.println(surveyCompanyDao.findAll());
System.out.println("All Insurance companies:");
System.out.println(insuranceCompanyDao.findAll());
InsuranceCompany ic = insuranceCompanyDao.findAll().get(0);
System.out.println(service.getSurveyCompany(ic));
}
}
我的服务级别:
import ...
@Service
public class InsuranceCompanyService {
@Autowired
InsuranceCompanyDao insuranceCompanyDao;
@Transactional
public List<SurveyCompany> getSurveyCompany(InsuranceCompany insuranceCompany){
List<SurveyCompany> surveyCompanies = insuranceCompany.getSurveyCompany();
return surveyCompanies;
}
}
共 (0) 个答案