Bx orm entities
Skill ortus-boxlang/skills/boxlang-modules/bx-orm/bx-orm-entities
Use this skill when defining BoxLang ORM entities: the persistent annotation, entity names, table mapping, property annotations, fieldtype, ormType, identifiers/primary keys, composite keys, version fields, and entity inheritance.From its SKILL.md
npx -y skills add ortus-boxlang/skills --skill bx-orm-entitiesAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
2 things to look at
- no licenseNo license file was found in the repository. Code published without one is not open source by default, so using it at work is a question for whoever answers licensing questions where you are.
- 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
6.0 KB, ~1.5k tokens by cl100k_base, as published. Nobody here has run it
bx-orm: Entities & Properties
Defining a Persistent Entity
// Minimal entity — table name defaults to class file name
class persistent="true" {
}
// With explicit entity name and table
class persistent="true" entityName="Author" table="authors" {
}
Entity Annotations
| Annotation | Type | Default | Description |
|---|---|---|---|
persistent | boolean | false | Marks the class as an ORM entity |
entityName | string | class name | Override the entity name |
table | string | entity name | Override the database table name |
schema | string | Database schema name | |
catalog | string | Database catalog name | |
datasource | string | this.datasource | Override datasource per entity |
readonly | boolean | false | Map to an existing table read-only |
dynamicInsert | boolean | false | Only INSERT non-null columns |
dynamicUpdate | boolean | false | Only UPDATE changed columns |
cacheUse | string/boolean | Enable L2 caching for this entity | |
cacheName | string | entity name | L2 cache region name |
batchSize | number | Hibernate batch fetch size |
Defining Properties
All properties inside a persistent=true class are persistent by default:
class persistent="true" entityName="User" table="users" {
// Primary key
property name="id" fieldtype="id" type="numeric" generator="native";
// Basic string column
property name="username" type="string";
// With explicit column name
property name="createdAt" column="created_at" type="date" ormtype="timestamp";
// Non-persistent (ignored by ORM)
property name="transientHelper" persistent="false";
// With default value (BoxLang side only, not DB-level)
property name="isActive" type="boolean" default="true";
// With DB-level default
property name="createdOn" ormtype="datetime" dbdefault="'2024-01-01'";
// Not-null constraint
property name="email" type="string" notnull="true";
}
Property Annotations Reference
| Annotation | Examples | Description |
|---|---|---|
name | "userId" | Property name |
column | "user_id" | Database column name |
type | string, numeric, date | BoxLang data type |
ormType | big_decimal, timestamp, text | Hibernate type |
sqlType | nvarchar(100) | Vendor-specific SQL type (DDL only) |
fieldtype | id, column, one-to-many, etc. | Field behavior |
notnull | true | NOT NULL constraint |
length | 255 | VARCHAR length |
default | "active" | BoxLang property default |
dbdefault | "'pending'" | Database column default |
persistent | false | Exclude this property from ORM |
insert | false | Exclude from INSERT |
update | false | Exclude from UPDATE |
unique | true | Unique constraint |
index | "idx_email" | Create an index |
Identifiers (Primary Keys)
// Auto-increment (native — recommended)
property name="id" fieldtype="id" type="numeric" generator="native";
// UUID primary key
property name="id" fieldtype="id" type="string" generator="uuid";
// Assigned (you set the ID manually)
property name="id" fieldtype="id" type="string" generator="assigned";
// Sequence (for Oracle/PostgreSQL)
property name="id"
fieldtype="id"
type="numeric"
generator="sequence"
sequence="seq_users";
Generator values: native, identity, uuid, assigned, sequence, increment, hilo.
Composite Primary Keys
class persistent="true" entityName="OrderItem" table="order_items" {
property name="orderId" fieldtype="id" type="numeric" column="order_id";
property name="productId" fieldtype="id" type="numeric" column="product_id";
property name="quantity" type="numeric";
property name="price" type="numeric" ormtype="big_decimal";
}
Version / Optimistic Locking
class persistent="true" entityName="Product" {
property name="id" fieldtype="id" generator="native";
property name="name" type="string";
property name="version" fieldtype="version" type="numeric";
}
// Hibernate increments version on every update.
// Throws StaleObjectStateException if two sessions modify the same row.
Timestamp Auto-Fields
property name="createdAt" fieldtype="timestamp" generated="insert";
property name="updatedAt" fieldtype="timestamp" generated="always";
Full Entity Example
class persistent="true" entityName="Post" table="blog_posts" {
property name="id"
fieldtype = "id"
type = "numeric"
generator = "native";
property name="title"
type = "string"
length = 200
notnull = "true";
property name="body"
type = "string"
ormtype = "text";
property name="status"
type = "string"
length = 20
default = "draft";
property name="publishedAt"
column = "published_at"
type = "date"
ormtype = "timestamp";
property name="createdAt"
column = "created_at"
ormtype = "datetime"
insert = "true"
update = "false"
dbdefault = "CURRENT_TIMESTAMP";
}
Common Pitfalls
- ❌ Do NOT omit
generatoronfieldtype="id"— usenativefor auto-increment - ❌ Do NOT use
type="date"when you need full datetime — useormtype="timestamp" - ❌ Quote datetime
dbdefaultvalues:dbdefault="'2024-01-01'"(MySQL requires single-quoted strings) - ✅ Use
persistent="false"for calculated properties or transient helpers - ✅ Use
dynamicUpdate="true"on large entities where only a few columns change per save - ✅ Use
insert="false" update="false"on columns that are managed by DB triggers
What ships with it
Read from the repository
Just SKILL.md. No reference files, no scripts.