diff --git a/src/main/java/simpaths/data/startingpop/Processed.java b/src/main/java/simpaths/data/startingpop/Processed.java index 967f5d3a7..5a2186fb2 100644 --- a/src/main/java/simpaths/data/startingpop/Processed.java +++ b/src/main/java/simpaths/data/startingpop/Processed.java @@ -2,6 +2,8 @@ import jakarta.persistence.*; +import org.hibernate.annotations.Fetch; +import org.hibernate.annotations.FetchMode; import simpaths.model.BenefitUnit; import simpaths.model.Household; import simpaths.model.Person; @@ -22,8 +24,9 @@ public class Processed { * ATTRIBUTES */ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id", unique = true, nullable = false) private Long id; - @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, mappedBy = "processed") + @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "processed") @OrderBy("key ASC") + @Fetch(FetchMode.SUBSELECT) private Set households = new LinkedHashSet<>(); @Enumerated(EnumType.STRING) Country country; diff --git a/src/main/java/simpaths/model/SimPathsModel.java b/src/main/java/simpaths/model/SimPathsModel.java index 684e8f44c..bba70d9b9 100644 --- a/src/main/java/simpaths/model/SimPathsModel.java +++ b/src/main/java/simpaths/model/SimPathsModel.java @@ -3314,6 +3314,7 @@ private Processed getProcessed() { private Processed getProcessed(Country country, int startYear, int popSize, boolean ignoreTargetsAtPopulationLoad) { Processed processed = null; + Processed processed_return = null; EntityTransaction txn = null; try { @@ -3324,7 +3325,7 @@ private Processed getProcessed(Country country, int startYear, int popSize, bool EntityManager em = Persistence.createEntityManagerFactory("starting-population", propertyMap).createEntityManager(); txn = em.getTransaction(); txn.begin(); - String query = "SELECT processed FROM Processed processed LEFT JOIN FETCH processed.households households LEFT JOIN FETCH households.benefitUnits benefitUnits LEFT JOIN FETCH benefitUnits.members members WHERE processed.startYear = " + startYear + " AND processed.popSize = " + popSize + " AND processed.country = " + country + " AND processed.noTargets = " + ignoreTargetsAtPopulationLoad + " ORDER BY households.key.id"; + String query = "SELECT processed FROM Processed processed WHERE processed.startYear = " + startYear + " AND processed.popSize = " + popSize + " AND processed.country = " + country + " AND processed.noTargets = " + ignoreTargetsAtPopulationLoad; log.info("Submitting SQL query: " + query); List processedList = em.createQuery(query).getResultList(); @@ -3334,7 +3335,15 @@ private Processed getProcessed(Country country, int startYear, int popSize, bool if (processedList.size()>1) throw new RuntimeException("more than one relevant dataset returned from database"); processed = processedList.get(0); - processed.resetDependents(); + + // Now fetch households for THIS specific Processed instance only + processed_return = em.createQuery( + "SELECT p FROM Processed p LEFT JOIN FETCH p.households h WHERE p = :proc ORDER BY h.key.id", + Processed.class) + .setParameter("proc", processed) + .getSingleResult(); + + processed_return.resetDependents(); } // close database connection