[{"data":1,"prerenderedAt":719},["ShallowReactive",2],{"navigation_docs":3,"-apps-persistence-defining-entities":196,"-apps-persistence-defining-entities-surround":714},[4,127,166],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":36},"Kinotic Apps","i-lucide-rocket","\u002Fapps","1.apps",[10,14,18,37,58,91,106,122],{"title":11,"path":12,"stem":13},"Introduction","\u002Fapps\u002Fintroduction","1.apps\u002F1.introduction",{"title":15,"path":16,"stem":17},"Quick Start","\u002Fapps\u002Fquick-start","1.apps\u002F2.quick-start",{"title":19,"icon":20,"path":21,"stem":22,"children":23,"page":36},"Application Structure","i-lucide-folder-tree","\u002Fapps\u002Fapplication-structure","1.apps\u002F3.application-structure",[24,28,32],{"title":25,"path":26,"stem":27},"Overview","\u002Fapps\u002Fapplication-structure\u002Foverview","1.apps\u002F3.application-structure\u002F1.overview",{"title":29,"path":30,"stem":31},"Applications and Projects","\u002Fapps\u002Fapplication-structure\u002Fapplications-and-projects","1.apps\u002F3.application-structure\u002F2.applications-and-projects",{"title":33,"path":34,"stem":35},"Artifact Types","\u002Fapps\u002Fapplication-structure\u002Fartifact-types","1.apps\u002F3.application-structure\u002F3.artifact-types",false,{"title":38,"icon":39,"path":40,"stem":41,"children":42,"page":36},"Services","i-lucide-network","\u002Fapps\u002Fservices","1.apps\u002F4.services",[43,46,50,54],{"title":25,"path":44,"stem":45},"\u002Fapps\u002Fservices\u002Foverview","1.apps\u002F4.services\u002F1.overview",{"title":47,"path":48,"stem":49},"Publishing Services","\u002Fapps\u002Fservices\u002Fpublishing-services","1.apps\u002F4.services\u002F2.publishing-services",{"title":51,"path":52,"stem":53},"Service Proxies","\u002Fapps\u002Fservices\u002Fservice-proxies","1.apps\u002F4.services\u002F3.service-proxies",{"title":55,"path":56,"stem":57},"Streaming","\u002Fapps\u002Fservices\u002Fstreaming","1.apps\u002F4.services\u002F4.streaming",{"title":59,"icon":60,"path":61,"stem":62,"children":63,"page":36},"Persistence","i-lucide-database","\u002Fapps\u002Fpersistence","1.apps\u002F5.persistence",[64,67,71,75,79,83,87],{"title":25,"path":65,"stem":66},"\u002Fapps\u002Fpersistence\u002Foverview","1.apps\u002F5.persistence\u002F1.overview",{"title":68,"path":69,"stem":70},"Defining Entities","\u002Fapps\u002Fpersistence\u002Fdefining-entities","1.apps\u002F5.persistence\u002F2.defining-entities",{"title":72,"path":73,"stem":74},"Entity Decorators","\u002Fapps\u002Fpersistence\u002Fentity-decorators","1.apps\u002F5.persistence\u002F3.entity-decorators",{"title":76,"path":77,"stem":78},"CRUD Operations","\u002Fapps\u002Fpersistence\u002Fcrud-operations","1.apps\u002F5.persistence\u002F4.crud-operations",{"title":80,"path":81,"stem":82},"Named Queries","\u002Fapps\u002Fpersistence\u002Fnamed-queries","1.apps\u002F5.persistence\u002F5.named-queries",{"title":84,"path":85,"stem":86},"Multi-Tenancy","\u002Fapps\u002Fpersistence\u002Fmulti-tenancy","1.apps\u002F5.persistence\u002F6.multi-tenancy",{"title":88,"path":89,"stem":90},"Migrations","\u002Fapps\u002Fpersistence\u002Fmigrations","1.apps\u002F5.persistence\u002F7.migrations",{"title":92,"icon":93,"path":94,"stem":95,"children":96,"page":36},"Security","i-lucide-shield-check","\u002Fapps\u002Fsecurity","1.apps\u002F6.security",[97,101],{"title":98,"path":99,"stem":100,"icon":93},"Access Control","\u002Fapps\u002Fsecurity\u002Faccess-control","1.apps\u002F6.security\u002F1.access-control",{"title":102,"path":103,"stem":104,"icon":105},"Authentication","\u002Fapps\u002Fsecurity\u002Fauthentication","1.apps\u002F6.security\u002F2.authentication","i-lucide-key-round",{"title":107,"icon":108,"path":109,"stem":110,"children":111,"page":36},"Deployment","i-lucide-cloud-upload","\u002Fapps\u002Fdeployment","1.apps\u002F7.deployment",[112,117],{"title":113,"path":114,"stem":115,"icon":116},"Deployment Workflow","\u002Fapps\u002Fdeployment\u002Fworkflow","1.apps\u002F7.deployment\u002F1.workflow","i-lucide-git-branch",{"title":118,"path":119,"stem":120,"icon":121},"Environments","\u002Fapps\u002Fdeployment\u002Fenvironments","1.apps\u002F7.deployment\u002F2.environments","i-lucide-server",{"title":123,"path":124,"stem":125,"icon":126},"CLI Reference","\u002Fapps\u002Fcli-reference","1.apps\u002F8.cli-reference","i-lucide-terminal",{"title":128,"icon":121,"path":129,"stem":130,"children":131,"page":36},"Kinotic OS","\u002Fplatform","2.platform",[132,137,141,146,151,156,161],{"title":133,"path":134,"stem":135,"icon":136},"System Architecture","\u002Fplatform\u002Farchitecture","2.platform\u002F1.architecture","i-lucide-boxes",{"title":138,"path":139,"stem":140,"icon":6},"Deployment Guide","\u002Fplatform\u002Fdeployment-guide","2.platform\u002F2.deployment-guide",{"title":142,"path":143,"stem":144,"icon":145},"Configuration","\u002Fplatform\u002Fconfiguration","2.platform\u002F3.configuration","i-lucide-settings",{"title":147,"path":148,"stem":149,"icon":150},"Organization Management","\u002Fplatform\u002Forganization-management","2.platform\u002F4.organization-management","i-lucide-building-2",{"title":152,"path":153,"stem":154,"icon":155},"System Security","\u002Fplatform\u002Fsystem-security","2.platform\u002F5.system-security","i-lucide-shield",{"title":157,"path":158,"stem":159,"icon":160},"Observability","\u002Fplatform\u002Fobservability","2.platform\u002F6.observability","i-lucide-activity",{"title":162,"path":163,"stem":164,"icon":165},"Contributing","\u002Fplatform\u002Fcontributing","2.platform\u002F7.contributing","i-lucide-git-pull-request",{"title":167,"icon":168,"path":169,"stem":170,"children":171,"page":36},"Reference","i-lucide-book-open","\u002Freference","3.reference",[172,177,181,186,191],{"title":173,"path":174,"stem":175,"icon":176},"Decorators Reference","\u002Freference\u002Fdecorators","3.reference\u002F1.decorators","i-lucide-at-sign",{"title":178,"path":179,"stem":180,"icon":60},"Migration SQL Grammar","\u002Freference\u002Fmigration-sql-grammar","3.reference\u002F2.migration-sql-grammar",{"title":182,"path":183,"stem":184,"icon":185},"ABAC Expression Language","\u002Freference\u002Fabac-expression-language","3.reference\u002F3.abac-expression-language","i-lucide-file-code",{"title":187,"path":188,"stem":189,"icon":190},"CRI Format","\u002Freference\u002Fcri-format","3.reference\u002F4.cri-format","i-lucide-link",{"title":192,"path":193,"stem":194,"icon":195},"SDK Packages","\u002Freference\u002Fsdk-packages","3.reference\u002F5.sdk-packages","i-lucide-package",{"id":197,"title":68,"body":198,"description":708,"extension":709,"links":710,"meta":711,"navigation":284,"path":69,"seo":712,"stem":70,"__hash__":713},"docs\u002F1.apps\u002F5.persistence\u002F2.defining-entities.md",{"type":199,"value":200,"toc":696},"minimark",[201,210,215,221,438,442,445,449,455,474,479,499,503,521,525,528,532,545,575,578,581,586,686,692],[202,203,204,205,209],"p",{},"Entities are TypeScript classes annotated with the ",[206,207,208],"code",{},"@Entity()"," decorator. Each entity gets a fully typed CRUD service generated automatically.",[211,212,214],"h2",{"id":213},"basic-entity","Basic Entity",[202,216,217,218,220],{},"Every entity needs at least the ",[206,219,208],{}," decorator on the class and an ID field.",[222,223,228],"pre",{"className":224,"code":225,"language":226,"meta":227,"style":227},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { Entity, AutoGeneratedId, NotNull, MultiTenancyType } from '@kinotic-ai\u002Fpersistence'\n\n@Entity(MultiTenancyType.NONE)\nexport class Person {\n    @AutoGeneratedId\n    id: string | null = null\n\n    @NotNull\n    firstName: string = ''\n\n    @NotNull\n    lastName: string = ''\n\n    age: number = 0\n}\n","typescript","",[206,229,230,279,286,305,322,331,356,361,369,384,389,396,410,415,432],{"__ignoreMap":227},[231,232,235,239,243,247,250,253,255,258,260,263,266,269,272,276],"span",{"class":233,"line":234},"line",1,[231,236,238],{"class":237},"s7zQu","import",[231,240,242],{"class":241},"sMK4o"," {",[231,244,246],{"class":245},"sTEyZ"," Entity",[231,248,249],{"class":241},",",[231,251,252],{"class":245}," AutoGeneratedId",[231,254,249],{"class":241},[231,256,257],{"class":245}," NotNull",[231,259,249],{"class":241},[231,261,262],{"class":245}," MultiTenancyType",[231,264,265],{"class":241}," }",[231,267,268],{"class":237}," from",[231,270,271],{"class":241}," '",[231,273,275],{"class":274},"sfazB","@kinotic-ai\u002Fpersistence",[231,277,278],{"class":241},"'\n",[231,280,282],{"class":233,"line":281},2,[231,283,285],{"emptyLinePlaceholder":284},true,"\n",[231,287,289,292,296,299,302],{"class":233,"line":288},3,[231,290,291],{"class":241},"@",[231,293,295],{"class":294},"s2Zo4","Entity",[231,297,298],{"class":245},"(MultiTenancyType",[231,300,301],{"class":241},".",[231,303,304],{"class":245},"NONE)\n",[231,306,308,311,315,319],{"class":233,"line":307},4,[231,309,310],{"class":237},"export",[231,312,314],{"class":313},"spNyl"," class",[231,316,318],{"class":317},"sBMFI"," Person",[231,320,321],{"class":241}," {\n",[231,323,325,328],{"class":233,"line":324},5,[231,326,327],{"class":241},"    @",[231,329,330],{"class":245},"AutoGeneratedId\n",[231,332,334,338,341,344,347,350,353],{"class":233,"line":333},6,[231,335,337],{"class":336},"swJcz","    id",[231,339,340],{"class":241},":",[231,342,343],{"class":317}," string",[231,345,346],{"class":241}," |",[231,348,349],{"class":317}," null",[231,351,352],{"class":241}," =",[231,354,355],{"class":241}," null\n",[231,357,359],{"class":233,"line":358},7,[231,360,285],{"emptyLinePlaceholder":284},[231,362,364,366],{"class":233,"line":363},8,[231,365,327],{"class":241},[231,367,368],{"class":245},"NotNull\n",[231,370,372,375,377,379,381],{"class":233,"line":371},9,[231,373,374],{"class":336},"    firstName",[231,376,340],{"class":241},[231,378,343],{"class":317},[231,380,352],{"class":241},[231,382,383],{"class":241}," ''\n",[231,385,387],{"class":233,"line":386},10,[231,388,285],{"emptyLinePlaceholder":284},[231,390,392,394],{"class":233,"line":391},11,[231,393,327],{"class":241},[231,395,368],{"class":245},[231,397,399,402,404,406,408],{"class":233,"line":398},12,[231,400,401],{"class":336},"    lastName",[231,403,340],{"class":241},[231,405,343],{"class":317},[231,407,352],{"class":241},[231,409,383],{"class":241},[231,411,413],{"class":233,"line":412},13,[231,414,285],{"emptyLinePlaceholder":284},[231,416,418,421,423,426,428],{"class":233,"line":417},14,[231,419,420],{"class":336},"    age",[231,422,340],{"class":241},[231,424,425],{"class":317}," number",[231,427,352],{"class":241},[231,429,431],{"class":430},"sbssI"," 0\n",[231,433,435],{"class":233,"line":434},15,[231,436,437],{"class":241},"}\n",[211,439,441],{"id":440},"properties-should-have-default-values","Properties Should Have Default Values",[202,443,444],{},"All properties on an entity class should have default values assigned. This ensures proper serialization and deserialization when data moves between your application and the server.",[211,446,448],{"id":447},"the-entity-decorator","The @Entity Decorator",[202,450,451,452,454],{},"The ",[206,453,208],{}," decorator accepts two parameters:",[222,456,458],{"className":224,"code":457,"language":226,"meta":227,"style":227},"@Entity(multiTenancyType, entityType)\n",[206,459,460],{"__ignoreMap":227},[231,461,462,464,466,469,471],{"class":233,"line":234},[231,463,291],{"class":241},[231,465,295],{"class":294},[231,467,468],{"class":245},"(multiTenancyType",[231,470,249],{"class":241},[231,472,473],{"class":245}," entityType)\n",[475,476,478],"h3",{"id":477},"multi-tenancy-type","Multi-Tenancy Type",[480,481,482,489],"ul",{},[483,484,485,488],"li",{},[206,486,487],{},"MultiTenancyType.NONE"," - No multi-tenancy. All data lives in a single index.",[483,490,491,494,495,498],{},[206,492,493],{},"MultiTenancyType.SHARED"," - Shared index with automatic tenant isolation. Requires a ",[206,496,497],{},"@TenantId"," field on the entity.",[475,500,502],{"id":501},"entity-type","Entity Type",[480,504,505,511],{},[483,506,507,510],{},[206,508,509],{},"EntityType.TABLE"," (default) - Standard entity for general-purpose data storage.",[483,512,513,516,517,520],{},[206,514,515],{},"EntityType.STREAM"," - Time-series data optimized for append-heavy workloads. Requires a ",[206,518,519],{},"@TimeReference"," field.",[211,522,524],{"id":523},"id-fields","ID Fields",[202,526,527],{},"Every entity must have exactly one ID field. You choose between two strategies:",[475,529,531],{"id":530},"autogeneratedid","@AutoGeneratedId",[202,533,534,535,537,538,541,542,301],{},"Use ",[206,536,531],{}," when you want the server to assign IDs automatically. The field type must be ",[206,539,540],{},"string | null",", initialized to ",[206,543,544],{},"null",[222,546,548],{"className":224,"code":547,"language":226,"meta":227,"style":227},"@AutoGeneratedId\nid: string | null = null\n",[206,549,550,556],{"__ignoreMap":227},[231,551,552,554],{"class":233,"line":234},[231,553,291],{"class":241},[231,555,330],{"class":245},[231,557,558,561,563,566,569,571,573],{"class":233,"line":281},[231,559,560],{"class":317},"id",[231,562,340],{"class":241},[231,564,565],{"class":245}," string ",[231,567,568],{"class":241},"|",[231,570,349],{"class":241},[231,572,352],{"class":241},[231,574,355],{"class":241},[202,576,577],{},"When you save a new entity, the server generates a unique ID and returns it on the saved object.",[475,579,580],{"id":560},"@Id",[202,582,534,583,585],{},[206,584,580],{}," when you want to control the ID value yourself.",[222,587,589],{"className":224,"code":588,"language":226,"meta":227,"style":227},"import { Entity, Id, MultiTenancyType } from '@kinotic-ai\u002Fpersistence'\n\n@Entity(MultiTenancyType.NONE)\nexport class Device {\n    @Id\n    serialNumber: string = ''\n\n    name: string = ''\n}\n",[206,590,591,618,622,634,645,652,665,669,682],{"__ignoreMap":227},[231,592,593,595,597,599,601,604,606,608,610,612,614,616],{"class":233,"line":234},[231,594,238],{"class":237},[231,596,242],{"class":241},[231,598,246],{"class":245},[231,600,249],{"class":241},[231,602,603],{"class":245}," Id",[231,605,249],{"class":241},[231,607,262],{"class":245},[231,609,265],{"class":241},[231,611,268],{"class":237},[231,613,271],{"class":241},[231,615,275],{"class":274},[231,617,278],{"class":241},[231,619,620],{"class":233,"line":281},[231,621,285],{"emptyLinePlaceholder":284},[231,623,624,626,628,630,632],{"class":233,"line":288},[231,625,291],{"class":241},[231,627,295],{"class":294},[231,629,298],{"class":245},[231,631,301],{"class":241},[231,633,304],{"class":245},[231,635,636,638,640,643],{"class":233,"line":307},[231,637,310],{"class":237},[231,639,314],{"class":313},[231,641,642],{"class":317}," Device",[231,644,321],{"class":241},[231,646,647,649],{"class":233,"line":324},[231,648,327],{"class":241},[231,650,651],{"class":245},"Id\n",[231,653,654,657,659,661,663],{"class":233,"line":333},[231,655,656],{"class":336},"    serialNumber",[231,658,340],{"class":241},[231,660,343],{"class":317},[231,662,352],{"class":241},[231,664,383],{"class":241},[231,666,667],{"class":233,"line":358},[231,668,285],{"emptyLinePlaceholder":284},[231,670,671,674,676,678,680],{"class":233,"line":363},[231,672,673],{"class":336},"    name",[231,675,340],{"class":241},[231,677,343],{"class":317},[231,679,352],{"class":241},[231,681,383],{"class":241},[231,683,684],{"class":233,"line":371},[231,685,437],{"class":241},[202,687,688,689,691],{},"With ",[206,690,580],{},", you are responsible for providing a unique value before saving.",[693,694,695],"style",{},"html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":227,"searchDepth":281,"depth":281,"links":697},[698,699,700,704],{"id":213,"depth":281,"text":214},{"id":440,"depth":281,"text":441},{"id":447,"depth":281,"text":448,"children":701},[702,703],{"id":477,"depth":288,"text":478},{"id":501,"depth":288,"text":502},{"id":523,"depth":281,"text":524,"children":705},[706,707],{"id":530,"depth":288,"text":531},{"id":560,"depth":288,"text":580},"How to define entities using TypeScript decorators for Kinotic's persistence layer.","md",null,{},{"title":68,"description":708},"Qsxaxk67BPrCo-vhL7aIFQu-k1RJMOHAVLCc65XvDK8",[715,717],{"title":25,"path":65,"stem":66,"description":716,"children":-1},"Kinotic's persistence layer provides declarative data management with automatic CRUD service generation from TypeScript entity definitions.",{"title":72,"path":73,"stem":74,"description":718,"children":-1},"All available entity decorators for configuring field behavior, indexing, relationships, and versioning in Kinotic persistence.",1775187765276]