LicenseDO.ktJPA entity for license records. Maps to T_PLUGIN_LM_LICENSE table. Extends DefaultBaseDO (provides id, created, lastUpdate, deleted). 154 lines, 16 data fields + 1 computed property.
Text/searchable fields (15 fields with @FullTextField for Hibernate Search indexing):
organization — company name (VARCHAR 1000)product — software product name (VARCHAR 1000)version — software version (VARCHAR 1000)updateFromVersion — upgrade source version (VARCHAR 1000, column update_from_version)licenseHolder — who holds the license (VARCHAR 10000)key — license key as text (VARCHAR 10000) — allows copy-paste of text-based keysownerIds — comma-separated owner user IDs (VARCHAR 4000) — used by LicenseManagementRight for visibility controldevice — associated device/hostname (VARCHAR 4000)comment — free text notes (Constants.LENGTH_TEXT)numberOfLicenses — concurrent/seat count (Integer)validSince, validUntil — license validity date range (LocalDate)status — @Enumerated(STRING) — see LicenseStatusBLOB file storage (2 binary attachment slots — note: not JCR, uses direct database BLOBs):
file1 / filename1 — first attachment BLOB + filename (e.g. license certificate PDF)file2 / filename2 — second attachment BLOB + filename (e.g. license agreement)Both BLOB fields are annotated @NoHistory (excluded from history/delta tracking — binary diffs would be meaningless) and FetchType.LAZY (loaded only when explicitly accessed, not on every query). Uses @JdbcTypeCode(SqlTypes.BLOB) for proper JDBC BLOB handling.
Computed property: orderString (@Transient) — returns "$organization-$product-$version" for sorting and display.
toString(): custom implementation using ReflectionToString that excludes file1 and file2 (binary content would produce meaningless hex dumps).