From 464ff347f532cee4a593c307731bcab1d7e7a98e Mon Sep 17 00:00:00 2001 From: Andy Baxter Date: Thu, 9 Oct 2025 15:26:17 +0100 Subject: [PATCH 1/3] experimental - loading processed lazily #261 --- src/main/java/simpaths/model/SimPathsModel.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/simpaths/model/SimPathsModel.java b/src/main/java/simpaths/model/SimPathsModel.java index 684e8f44c..7909dbcec 100644 --- a/src/main/java/simpaths/model/SimPathsModel.java +++ b/src/main/java/simpaths/model/SimPathsModel.java @@ -3324,7 +3324,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,6 +3334,8 @@ 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); + em.createQuery("SELECT processed FROM Processed processed LEFT JOIN FETCH processed.households households"). + getSingleResult(); processed.resetDependents(); } From 16af2f58b7db108882c05f7a89d62a856d4bfaf6 Mon Sep 17 00:00:00 2001 From: Andy Baxter Date: Fri, 10 Oct 2025 20:26:30 +0100 Subject: [PATCH 2/3] Fixed getProcessed SQL call to return correct households #261 --- src/main/java/simpaths/model/SimPathsModel.java | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/main/java/simpaths/model/SimPathsModel.java b/src/main/java/simpaths/model/SimPathsModel.java index 7909dbcec..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 { @@ -3334,9 +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); - em.createQuery("SELECT processed FROM Processed processed LEFT JOIN FETCH processed.households households"). - getSingleResult(); - 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 From 46ed923c0aaaa57ce906c09bde3e8eb49e371c98 Mon Sep 17 00:00:00 2001 From: Andy Baxter Date: Fri, 10 Oct 2025 20:27:43 +0100 Subject: [PATCH 3/3] lazy fetching households #261 --- src/main/java/simpaths/data/startingpop/Processed.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) 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;