Skip to content

fix: Harmonize db sequences for tracker [DHIS2-21378]#24208

Merged
enricocolasante merged 2 commits into
masterfrom
DHIS2-21378-sequence
Jun 15, 2026
Merged

fix: Harmonize db sequences for tracker [DHIS2-21378]#24208
enricocolasante merged 2 commits into
masterfrom
DHIS2-21378-sequence

Conversation

@enricocolasante

@enricocolasante enricocolasante commented Jun 12, 2026

Copy link
Copy Markdown
Contributor

Summary

Aligns tracker database sequence names with their table names and gives relationship/relationshipitem dedicated sequences instead of the shared global hibernate_sequence DHIS2-21378. This also fixes a real divergence introduced by the event table split: the SingleEvent Hibernate mapping kept drawing ids from the legacy programstageinstance_sequence while the JDBC import path used singleevent_sequence, so the two counters drifted apart.

Changes

  • Migration V2_44_12__rename_tracker_sequences_to_match_table_names.sql: renames trackedentityinstance_sequencetrackedentity_sequence and programinstance_sequenceenrollment_sequence; resyncs singleevent_sequence to the table's max id and drops the legacy programstageinstance_sequence; creates dedicated relationship_sequence and relationshipitem_sequence seeded from the current max ids. All setval calls use coalesce(max(...), 1) so empty tables are seeded explicitly.
  • Hibernate mappings: SingleEvent.hbm.xml now draws from singleevent_sequence; Relationship.hbm.xml and RelationshipItem.hbm.xml switch from <generator class="native"/> (the shared hibernate_sequence) to their dedicated sequences.
  • JPA annotations: TrackedEntity.java and Enrollment.java reference the renamed sequences. TrackedEntity now declares an explicit generator name and allocationSize = 1, matching Enrollment, so the JPA default of 50 can never collide with the JDBC importer's plain-nextval allocation if a Hibernate persist path is ever added.
  • Persisters: TrackedEntityPersister, EnrollmentPersister, and RelationshipPersister allocate ids from the renamed/new sequences; EntityWriteBatch allocates relationship item ids from relationshipitem_sequence instead of hibernate_sequence.
  • HibernateRelationshipStore: disables the Hibernate query cache for the whole store (constructor cacheable=false) instead of per-query hints. Every query space this store reads is written via raw JDBC in the importer, which bypasses query-cache invalidation — cached results would go stale across imports (e.g. an empty duplicate-check result would silently disable duplicate detection). This brings the store in line with all other tracker stores, which already pass cacheable=false.

Next Steps

Done

To do

  • EntityWriteBatch refactor

@sonarqubecloud

Copy link
Copy Markdown

@enricocolasante
enricocolasante marked this pull request as ready for review June 12, 2026 13:04
@enricocolasante
enricocolasante requested a review from a team as a code owner June 12, 2026 13:04
-- singleevent_sequence, so the two counters diverged. Resync the canonical sequence to the
-- table's max id and drop the legacy sequence.
select setval('singleevent_sequence', coalesce(max(eventid), 1)) from singleevent;
drop sequence if exists programstageinstance_sequence;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

TrackerEvent sequence already aligned?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, trackerevent_sequence was added when splitting event table

@enricocolasante
enricocolasante merged commit f52eefa into master Jun 15, 2026
23 checks passed
@enricocolasante
enricocolasante deleted the DHIS2-21378-sequence branch June 15, 2026 10:55
enricocolasante added a commit that referenced this pull request Jul 7, 2026
… (2.43) (#24286)

* feat: remove EntityManager from TrackerPersister [DHIS2-21378] (#23797)

* feat: remove EntityManager from TrackerPersister interface and method parameters [DHIS2-21378]

* Use default timezone

(cherry picked from commit 052d3ac)

* feat: decouple ChangeLogAccumulator from Hibernate Session [DHIS2-21378] (#23836)

(cherry picked from commit 0c1779f)

* chore: Extract FileResource assignment update [DHIS2-21378] (#23879)

* chore: Extract FileResource assignment update [DHIS2-21378]

* Code review fixes

* Code review fixes

(cherry picked from commit 83542f4)

* feat: stage TEAV writes through EntityWriteBatch [DHIS2-21378] (#23970)

(cherry picked from commit b30c1ce)

* feat: Batch entity when persisting [DHIS2-21378] (#24005)

(cherry picked from commit 100dff1)

* feat: remove EntityManager from DefaultTrackerBundleService [DHIS2-21378] (#24024)

(cherry picked from commit 3759453)

* feat: TrackedEntity JDBC insert [DHIS2-21378] (#24027)

(cherry picked from commit 4eaf6ba)

* feat: TrackedEntity JDBC update [DHIS2-21378] (#24079)

(cherry picked from commit d4af287)

* feat: Enrollment JDBC insert/update [DHIS2-21378] (#24081)

* feat: TrackedEntity JDBC update [DHIS2-21378]

* feat: Enrollment JDBC insert/update [DHIS2-21378]

* Remove L2 caching from enrollment

* Code review fixes

* Code review fixes

(cherry picked from commit 34d629e)

* feat: Tracker event JDBC insert/update [DHIS2-21378] (#24082)

* feat: TrackedEntity JDBC insert [DHIS2-21378]

* feat: TrackedEntity JDBC update [DHIS2-21378]

* feat: Enrollment JDBC insert/update [DHIS2-21378]

* feat: Tracker event JDBC insert/update [DHIS2-21378]

(cherry picked from commit 435872b)

* feat: Single event JDBC insert/update [DHIS2-21378] (#24083)

* feat: TrackedEntity JDBC insert [DHIS2-21378]

* feat: TrackedEntity JDBC update [DHIS2-21378]

* feat: Enrollment JDBC insert/update [DHIS2-21378]

* feat: Tracker event JDBC insert/update [DHIS2-21378]

* feat: Single event JDBC insert/update [DHIS2-21378]

* Format code

(cherry picked from commit 9703e4f)

* feat: Relationship JDBC insert/update [DHIS2-21378] (#24093)

* feat: TrackedEntity JDBC insert [DHIS2-21378]

* feat: TrackedEntity JDBC update [DHIS2-21378]

* feat: Enrollment JDBC insert/update [DHIS2-21378]

* feat: Tracker event JDBC insert/update [DHIS2-21378]

* feat: Single event JDBC insert/update [DHIS2-21378]

* feat: Relationship JDBC insert/update [DHIS2-21378]

(cherry picked from commit 658f0a8)

* feat: TEAV JDBC insert/update [DHIS2-21378] (#24098)

* feat: TrackedEntity JDBC update [DHIS2-21378]

* feat: Enrollment JDBC insert/update [DHIS2-21378]

* feat: Tracker event JDBC insert/update [DHIS2-21378]

* feat: Single event JDBC insert/update [DHIS2-21378]

* feat: Relationship JDBC insert/update [DHIS2-21378]

* feat: TEAV JDBC insert/update [DHIS2-21378]

* Code review fixes

* Fix tests

* Fix idScheme issue for TEAV

(cherry picked from commit 4e3367c)

* fix: Refactor persistence layer in tracker importer [DHIS2-21378] (#24197)

* feat: TrackedEntity JDBC update [DHIS2-21378]

* feat: Enrollment JDBC insert/update [DHIS2-21378]

* feat: Tracker event JDBC insert/update [DHIS2-21378]

* feat: Single event JDBC insert/update [DHIS2-21378]

* feat: Relationship JDBC insert/update [DHIS2-21378]

* feat: TEAV JDBC insert/update [DHIS2-21378]

* Code review fixes

* Fix tests

* Fix idScheme issue for TEAV

* fix: Refactor persistence layer in tracker importer [DHIS2-21378]

* Fix merge

(cherry picked from commit 194dcd1)

* fix: Harmonize db sequences for tracker [DHIS2-21378] (#24208)

* fix: Harmonize db sequences for tracker [DHIS2-21378]

* Fix relationshipitemid

(cherry picked from commit f52eefa)

* fix: Rename conflicting migration [DHIS2-21378] (#24218)

(cherry picked from commit 7aefc1c)

No-op on 2.43: this PR renamed V2_44_12 -> V2_44_13 to avoid a master-only
Flyway version clash. On 2.43 the migration is numbered V2_43_63 (its own
series), so no rename is needed. Empty commit kept to preserve the full
DHIS2-21378 backport history.

* refactor: Split EntityWriteBatch into per-entity writers [DHIS2-21378] (#24227)

* refactor: Split EntityWriteBatch into per-entity writers [DHIS2-21378]

* chore: Migrate ownership from Hibernate to JDBC [DHIS2-21378]

* Code review fixes

(cherry picked from commit 331503a)

* chore: Migrate ownership from Hibernate to JDBC [DHIS2-21378] (#24239)

* refactor: Split EntityWriteBatch into per-entity writers [DHIS2-21378]

* chore: Migrate ownership from Hibernate to JDBC [DHIS2-21378]

(cherry picked from commit 7ba2431)

* perf: Batch existing-TEAV lookup in tracker import [DHIS2-21378] (#24244)

* refactor: Split EntityWriteBatch into per-entity writers [DHIS2-21378]

* chore: Migrate ownership from Hibernate to JDBC [DHIS2-21378]

* Code review fixes

* perf: Batch existing-TEAV lookup in tracker import [DHIS2-21378

* Code review fixes

* Code review fixes

(cherry picked from commit 2972a82)

* perf: Constant-text unnest INSERTs in tracker import [DHIS2-21378] (#24250)

* refactor: Split EntityWriteBatch into per-entity writers [DHIS2-21378]

* chore: Migrate ownership from Hibernate to JDBC [DHIS2-21378]

* Code review fixes

* perf: Batch existing-TEAV lookup in tracker import [DHIS2-21378

* perf: Constant-text unnest INSERTs in tracker import [DHIS2-21378]

* perf: Cache UserInfoSnapshot JSON per batch in tracker import [DHIS2-21378]

* Revert "perf: Cache UserInfoSnapshot JSON per batch in tracker import [DHIS2-21378]"

This reverts commit 7084379.

* Add tests to cover fields import

(cherry picked from commit 7305f9f)

* perf: Cache UserInfoSnapshot JSON per batch in tracker import [DHIS2-21378] (#24252)

* refactor: Split EntityWriteBatch into per-entity writers [DHIS2-21378]

* chore: Migrate ownership from Hibernate to JDBC [DHIS2-21378]

* Code review fixes

* perf: Batch existing-TEAV lookup in tracker import [DHIS2-21378

* perf: Constant-text unnest INSERTs in tracker import [DHIS2-21378]

* perf: Cache UserInfoSnapshot JSON per batch in tracker import [DHIS2-21378]

* Fix duration based Tracker perf tests

* Fix formatting

(cherry picked from commit a03204c)

* fix: Preserve storedby on tracker JDBC writers for 2.43 [DHIS2-21378]

Backport adaptation. On master, DHIS2-21537 removed storedBy from the
TrackedEntity/Enrollment/Event write path (and renamed TEAV storedBy to
updatedBy). 2.43 deliberately keeps storedBy, so the JDBC writers backported
from master must persist the storedby column that 2.43's tables still have.

TrackerObjectsMapper still sets storedBy on the new-entity branch for TE,
enrollment and events, so storedby is insert-only here (mirrors createdby):
added the storedby column + bind to the INSERT of TrackedEntityWriter,
EnrollmentWriter, SingleEventWriter and TrackerEventWriter. TeavWriter was
already adapted (storedby column + getStoredBy) when the earlier commits were
cherry-picked. Keeps the 2.43-only shouldSetStoredByToAuthenticatedUser* tests
green.

* Fix note persister

* Fix formatting
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants