У меня веб-приложение с весенней загрузкой и гибкой реализацией Spring JPA.У меня отношения один-много между моими сущностями, использующими аннотацию столбца соединения.Чтобы достичь этого, у технологического субъекта есть член List.Я отметил этот список как ленивый инициализированный.Все хорошо, но как только элемент управления выходит за пределы контроллера, hibernate запускает вызовы для отложенного сбора (List), не вызывая его.Это вызывает огромную задержку при загрузке веб-страницы.Не уверен, почему спящий режим запускает ленивые коллекции за пределами области действия контроллера.Я пытался использовать Hibernate.initialize и плагин улучшения байт-кода Maven, но, похоже, ничего не работает.Пожалуйста, помогите
Сущности
@Entity
@Table(name="EmergentTechnologies")
public class EmergentTechnology implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="ID")
private int id;
@OneToMany
@JoinColumn(name="ETID")
@Basic(fetch = FetchType.LAZY)
private List<Artifact> artifacts;
@Entity
@Table(name="Artifacts")
public class Artifact implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="ID")
private int id;
@Column(name="Analyst")
private String analyst;
@Column(name="ArtifactType")
private String artifactType;
свойства приложения
spring.mvc.favicon.enabled=false
logging.level.com.boeing.etl=INFO
spring.datasource.driver-class-name=com.microsoft.sqlserver.jdbc.SQLServerDriver
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
spring.jpa.generate-ddl=false
spring.jpa.show-sql=true
spring.jpa.hibernate.dialect=org.hibernate.dialect.SQLServer2012Dialect
pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.13</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cloud-connectors</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>sqljdbc4</artifactId>
<version>4.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>build-info</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.hibernate.orm.tooling</groupId>
<artifactId>hibernate-enhance-maven-plugin</artifactId>
<version>${hibernate.version}</version>
<executions>
<execution>
<configuration>
<failOnError>true</failOnError>
<enableLazyInitialization>true</enableLazyInitialization>
</configuration>
<goals>
<goal>enhance</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
Контроллер
@RequestMapping(value = "/artifacts", method = RequestMethod.GET)
@ResponseBody
public ResponseEntity<List<EmergentTechnology>> getAllArtifactsByEmergentTech(@RequestParam("id") String id) {
logger.info("Enter getAllArtifactsByEmergentTech");
int emergentTechId=Integer.parseInt(id);
List<EmergentTechnology> emergentTechnology = emergingTechLibService.getAllArtifactsByEmergentTech(emergentTechId);
logger.info("Exit getAllArtifactsByEmergentTech");
return ResponseEntity.status(HttpStatus.OK).body(emergentTechnology);
}
Сервис
@Override
public List<EmergentTechnology> getAllArtifactsByEmergentTech(int emergentTechId) {
logger.info("Enter getAllArtifactsByEmergentTech");
List<EmergentTechnology> emergentTechnologies=emergentTechnologyRepository.getAllArtifactsById(emergentTechId);
//Optional<EmergentTechnology> emergentTechnology=emergentTechnologyRepository.findById(emergentTechId);
//emergentTechnologies.add(emergentTechnology.get());
logger.info("After calling findAllArtifactsById()");
return emergentTechnologies;
}
Репозиторий
@Override
public List<EmergentTechnology> getAllArtifactsById(int emergentTechId) {
logger.info("Enter getEmergentTechnologies");
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<EmergentTechnology> criteriaQuery = criteriaBuilder.createQuery(EmergentTechnology.class);
Root<EmergentTechnology> root = criteriaQuery.from(EmergentTechnology.class);
criteriaQuery.select(root);
criteriaQuery.where(criteriaBuilder.equal(root.<Integer>get("id"), emergentTechId));
List<EmergentTechnology> emergingTechnologies = entityManager.createQuery(criteriaQuery).getResultList();
logger.info("Exit getEmergentTechnologies");
return emergingTechnologies;
}
Загрузка всех артефактов, когда управление выходит из контроллера (согласно журналам приложений)