得到这个完整的错误。
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.mycompany.database.SqlDetail.sqlValidationList, could not initialize proxy - no Session
at org.hibernate.collection.internal.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:587) ~[hibernate-core-5.0.12.Final.jar!/:5.0.12.Final]
at org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:204) ~[hibernate-core-5.0.12.Final.jar!/:5.0.12.Final]
at org.hibernate.collection.internal.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:566) ~[hibernate-core-5.0.12.Final.jar!/:5.0.12.Final]
at org.hibernate.collection.internal.AbstractPersistentCollection.read(AbstractPersistentCollection.java:135) ~[hibernate-core-5.0.12.Final.jar!/:5.0.12.Final]
at org.hibernate.collection.internal.PersistentBag.iterator(PersistentBag.java:277) ~[hibernate-core-5.0.12.Final.jar!/:5.0.12.Final]
at com.mycompany.services.selfServiceStatusDetermination.SqlValidator.validate(SqlValidator.java:46) ~[classes!/:0.0.1-SNAPSHOT]
at com.mycompany.services.selfServiceStatusDetermination.ValidationService.validateControl(ValidationService.java:90) ~[classes!/:0.0.1-SNAPSHOT]
at com.mycompany.services.CtrlPollingService.poll(CtrlPollingService.java:67) [classes!/:0.0.1-SNAPSHOT]
at com.mycompany.ScheduledTasks.reportCurrentTime(ScheduledTasks.java:63) [classes!/:0.0.1-SNAPSHOT]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_212]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_212]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_212]
at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_212]
at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:65) [spring-context-4.3.7.RELEASE.jar!/:4.3.7.RELEASE]
at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) [spring-context-4.3.7.RELEASE.jar!/:4.3.7.RELEASE]
at org.springframework.scheduling.concurrent.ReschedulingRunnable.run(ReschedulingRunnable.java:81) [spring-context-4.3.7.RELEASE.jar!/:4.3.7.RELEASE]
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [na:1.8.0_212]
at java.util.concurrent.FutureTask.run(FutureTask.java:266) [na:1.8.0_212]
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180) [na:1.8.0_212]
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) [na:1.8.0_212]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_212]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_212]
at java.lang.Thread.run(Thread.java:748) [na:1.8.0_212]
当我尝试从数据库中获取验证步骤时,会发生此错误。我感到奇怪的是,此错误有时仅会发生。 目前,此错误是在计划的过程中发生的,该过程要求服务器在清晨进入数据库。但是,当我进入并手动运行该过程时,似乎不会发生此错误。
这就是我们进行验证步骤的方式
@Repository
public interface ValidationStepRepo extends CrudRepository<ValidationStep, Long> {
@Query(value = "SELECT validationStep FROM ValidationStep validationStep WHERE validationStep.automationInformation.id = :aId "
+ "ORDER BY sequence ASC")
List<ValidationStep> findAllByAutomationInformationAid(@Param("aId") Long aId);
}
为了描述模式,我们有一个ValidationStep,它与SqlDetail具有一对一的关系,而SqlDetail具有SqlValidations的一对多的关系。
ValidationStep
@Entity
public class ValidationStep {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne
@JoinColumn(name= "automation_information_aId", referencedColumnName= "aId")
private AutomationInformation automationInformation;
private int sequence;
public enum ValidationType {
Email, Document, Sql, Custom
};
@Enumerated(EnumType.STRING)
private ValidationType type;
@OneToOne(cascade = { CascadeType.ALL }, orphanRemoval = true)
private EmailDetail emailDetail;
@OneToOne(cascade = { CascadeType.ALL }, orphanRemoval = true)
private DocumentDetail documentDetail;
@OneToOne(cascade = { CascadeType.ALL }, orphanRemoval = true)
private SqlDetail sqlDetail;
public ValidationStep() {
};
SqlDetail
@Entity
public class SqlDetail {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "sqlDetail_id")
private List<SqlValidation> sqlValidationList;
//no cascade, a connectionManager save/update cant save/update a a credential
//unidirectional mapping,
@OneToOne
@JoinColumn(name= "credential_id")
private Credential credential;
private String url;
public enum Driver {ORACLE, MICROSOFT, MYSQL};
@Enumerated(EnumType.STRING)
private Driver driver;
private String query;
SqlValidation
@Entity
public class SqlValidation {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
//type of validation
public enum SqlValidationKey {
RowCount, AnyRowContains, AllRowsContain, FirstRowContains
}
@Enumerated(EnumType.STRING)
public SqlValidationKey validationType;
//name of column to check against
private String columnName;
//<, = or > accepted: columnname < validation value is santax
private char operator;
//value which results in pass
private String validationValue;
SqlValidation() {
}