<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Annotations on Palmyra</title>
    <link>https://palmyra.dev/docs/api/backend/annotations/</link>
    <description>Recent content in Annotations on Palmyra</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <atom:link href="https://palmyra.dev/docs/api/backend/annotations/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>@PalmyraType</title>
      <link>https://palmyra.dev/docs/api/backend/annotations/palmyra-type/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://palmyra.dev/docs/api/backend/annotations/palmyra-type/</guid>
      <description>&lt;h1 id=&#34;palmyratype&#34;&gt;@PalmyraType&lt;a class=&#34;anchor&#34; href=&#34;#palmyratype&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;p&gt;&lt;code&gt;com.palmyralabs.palmyra.base.annotations.PalmyraType&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;Maps a POJO to its primary database table. Target: &lt;code&gt;TYPE&lt;/code&gt;. Retention: &lt;code&gt;RUNTIME&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;attributes&#34;&gt;Attributes&lt;a class=&#34;anchor&#34; href=&#34;#attributes&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;Attribute&lt;/th&gt;&#xA;          &lt;th&gt;Signature&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;type&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;String type() default &amp;quot;&amp;quot;&lt;/code&gt; — alias for &lt;code&gt;value&lt;/code&gt;; logical type name&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;value&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;String value() default &amp;quot;&amp;quot;&lt;/code&gt; — alias for &lt;code&gt;type&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;table&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;String table() default &amp;quot;&amp;quot;&lt;/code&gt; — DB table name&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;schema&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;String schema() default &amp;quot;&amp;quot;&lt;/code&gt; — DB schema name&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;aclMask&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;Acl aclMask() default Acl.ALL&lt;/code&gt; — access-control mask&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;active&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;boolean active() default true&lt;/code&gt; — whether the entity is active&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;searchAll&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;boolean searchAll() default false&lt;/code&gt; — all fields searchable&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;sortAll&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;boolean sortAll() default false&lt;/code&gt; — all fields sortable&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;preferredKey&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;String preferredKey() default &amp;quot;&amp;quot;&lt;/code&gt; — unique key to consult first during identity lookups (see &lt;a href=&#34;#preferredkey&#34;&gt;preferredKey&lt;/a&gt;)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;drop&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;DropMode drop() default DropMode.NONE&lt;/code&gt; — drop behavior&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;blockquote class=&#39;book-hint &#39;&gt;&#xA;&lt;p&gt;When the database uses &lt;code&gt;snake_case&lt;/code&gt;, supply &lt;code&gt;type&lt;/code&gt; in &lt;code&gt;CamelCase&lt;/code&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>@PalmyraField</title>
      <link>https://palmyra.dev/docs/api/backend/annotations/palmyra-field/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://palmyra.dev/docs/api/backend/annotations/palmyra-field/</guid>
      <description>&lt;h1 id=&#34;palmyrafield&#34;&gt;@PalmyraField&lt;a class=&#34;anchor&#34; href=&#34;#palmyrafield&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;p&gt;&lt;code&gt;com.palmyralabs.palmyra.base.annotations.PalmyraField&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;Attaches metadata to an attribute — column mapping, sort/search flags, validation, ACL, and pre-save transforms. Target: &lt;code&gt;FIELD&lt;/code&gt;. Retention: &lt;code&gt;RUNTIME&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;attributes&#34;&gt;Attributes&lt;a class=&#34;anchor&#34; href=&#34;#attributes&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;Attribute&lt;/th&gt;&#xA;          &lt;th&gt;Signature&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;attribute&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;String attribute() default &amp;quot;&amp;quot;&lt;/code&gt; — bean attribute name&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;value&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;String value() default &amp;quot;&amp;quot;&lt;/code&gt; — alias for &lt;code&gt;attribute&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;name&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;String name() default &amp;quot;&amp;quot;&lt;/code&gt; — logical field name&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;column&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;String column() default &amp;quot;&amp;quot;&lt;/code&gt; — DB column&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;title&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;String title() default &amp;quot;&amp;quot;&lt;/code&gt; — display title&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;displayOrder&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;int displayOrder() default 0&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;primaryKey&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;boolean primaryKey() default false&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;keyField&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;boolean keyField() default false&lt;/code&gt; — logical key field&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;primaryRef&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;String primaryRef() default &amp;quot;&amp;quot;&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;parentRef&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;String parentRef() default &amp;quot;&amp;quot;&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;search&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;boolean search() default false&lt;/code&gt; — searchable&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;sort&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;boolean sort() default false&lt;/code&gt; — sortable&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;quickSearch&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;boolean quickSearch() default false&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;pattern&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;String pattern() default &amp;quot;&amp;quot;&lt;/code&gt; — validation regex&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;notNull&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;boolean notNull() default false&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;mandatory&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;Mandatory mandatory() default Mandatory.NONE&lt;/code&gt; — operation-scoped required check (see &lt;a href=&#34;#mandatory&#34;&gt;Mandatory&lt;/a&gt;)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;active&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;boolean active() default true&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;virtual&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;boolean virtual() default false&lt;/code&gt; — non-persistent&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;aclMask&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;Acl aclMask() default Acl.DEFAULT&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;drop&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;DropMode drop() default DropMode.NONE&lt;/code&gt; — strip the attribute in a given direction (see &lt;a href=&#34;#dropmode&#34;&gt;DropMode&lt;/a&gt;)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;preProcessor&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;Class&amp;lt;? extends Function&amp;lt;Object,Object&amp;gt;&amp;gt; preProcessor() default processor.class&lt;/code&gt; — pre-save transform&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;childMode&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;ChildProcessMode childMode() default ChildProcessMode.MERGE&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h2 id=&#34;example&#34;&gt;Example&lt;a class=&#34;anchor&#34; href=&#34;#example&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;User&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;@PalmyraField&lt;/span&gt;(attribute &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;, column &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;user_id&amp;#34;&lt;/span&gt;, primaryKey &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; Long id;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;@PalmyraField&lt;/span&gt;(attribute &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;email&amp;#34;&lt;/span&gt;, sort &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;, search &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;, quickSearch &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; String loginName;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;@PalmyraField&lt;/span&gt;(attribute &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;displayName&amp;#34;&lt;/span&gt;, pattern &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;^[A-Za-z ]{1,64}$&amp;#34;&lt;/span&gt;, notNull &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; String name;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;flattening-with-parentref&#34;&gt;Flattening with &lt;code&gt;parentRef&lt;/code&gt;&lt;a class=&#34;anchor&#34; href=&#34;#flattening-with-parentref&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;code&gt;parentRef&lt;/code&gt; lets a DTO expose a &lt;strong&gt;scalar&lt;/strong&gt; that&amp;rsquo;s actually sourced from a joined table. The client sees a flat JSON shape; the backend still does the join. The dotted path can live on either &lt;code&gt;parentRef&lt;/code&gt; or &lt;code&gt;attribute&lt;/code&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>@PalmyraIgnore</title>
      <link>https://palmyra.dev/docs/api/backend/annotations/palmyra-ignore/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://palmyra.dev/docs/api/backend/annotations/palmyra-ignore/</guid>
      <description>&lt;h1 id=&#34;palmyraignore&#34;&gt;@PalmyraIgnore&lt;a class=&#34;anchor&#34; href=&#34;#palmyraignore&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;p&gt;&lt;code&gt;com.palmyralabs.palmyra.base.annotations.PalmyraIgnore&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;Marker annotation — excludes a field from Palmyra&amp;rsquo;s processing (no attribute). Target: &lt;code&gt;FIELD&lt;/code&gt;. Retention: &lt;code&gt;RUNTIME&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;attributes&#34;&gt;Attributes&lt;a class=&#34;anchor&#34; href=&#34;#attributes&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;em&gt;None.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;example&#34;&gt;Example&lt;a class=&#34;anchor&#34; href=&#34;#example&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;User&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; String loginName;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;@PalmyraIgnore&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;transient&lt;/span&gt; String oneTimeToken; &lt;span style=&#34;color:#75715e&#34;&gt;// never mapped, never serialized&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>@CrudMapping</title>
      <link>https://palmyra.dev/docs/api/backend/annotations/crud-mapping/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://palmyra.dev/docs/api/backend/annotations/crud-mapping/</guid>
      <description>&lt;h1 id=&#34;crudmapping&#34;&gt;@CrudMapping&lt;a class=&#34;anchor&#34; href=&#34;#crudmapping&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;p&gt;&lt;code&gt;com.palmyralabs.palmyra.base.annotations.CrudMapping&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;Binds a handler component to one or more URL paths and the entity type it operates on — Palmyra&amp;rsquo;s equivalent of Spring&amp;rsquo;s &lt;code&gt;@RequestMapping&lt;/code&gt; for CRUD surfaces. Target: &lt;code&gt;TYPE&lt;/code&gt;. Retention: &lt;code&gt;RUNTIME&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;attributes&#34;&gt;Attributes&lt;a class=&#34;anchor&#34; href=&#34;#attributes&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;Attribute&lt;/th&gt;&#xA;          &lt;th&gt;Signature&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;mapping&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;String[] mapping()&lt;/code&gt; — collection-level path; consumed by &lt;a href=&#34;https://palmyra.dev/docs/api/backend/handlers/query-handler/&#34;&gt;&lt;code&gt;QueryHandler&lt;/code&gt;&lt;/a&gt;, &lt;a href=&#34;https://palmyra.dev/docs/api/backend/handlers/create-handler/&#34;&gt;&lt;code&gt;CreateHandler&lt;/code&gt;&lt;/a&gt;, &lt;a href=&#34;https://palmyra.dev/docs/api/backend/handlers/save-handler/&#34;&gt;&lt;code&gt;SaveHandler&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;secondaryMapping&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;String secondaryMapping() default &amp;quot;&amp;quot;&lt;/code&gt; — single-record path (usually &lt;code&gt;{id}&lt;/code&gt;-templated); consumed by &lt;a href=&#34;https://palmyra.dev/docs/api/backend/handlers/update-handler/&#34;&gt;&lt;code&gt;UpdateHandler&lt;/code&gt;&lt;/a&gt;, &lt;a href=&#34;https://palmyra.dev/docs/api/backend/handlers/delete-handler/&#34;&gt;&lt;code&gt;DeleteHandler&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;type&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;Class&amp;lt;?&amp;gt; type()&lt;/code&gt; — entity type handled&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;queryType&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;Class&amp;lt;?&amp;gt; queryType() default Object.class&lt;/code&gt; — type used for query projections&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h2 id=&#34;which-handler-hits-which-url&#34;&gt;Which handler hits which URL&lt;a class=&#34;anchor&#34; href=&#34;#which-handler-hits-which-url&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Palmyra routes HTTP methods to handler interfaces based on &lt;strong&gt;which mapping&lt;/strong&gt; the request matched:&lt;/p&gt;</description>
    </item>
    <item>
      <title>@ActionMapping</title>
      <link>https://palmyra.dev/docs/api/backend/annotations/action-mapping/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://palmyra.dev/docs/api/backend/annotations/action-mapping/</guid>
      <description>&lt;h1 id=&#34;actionmapping&#34;&gt;@ActionMapping&lt;a class=&#34;anchor&#34; href=&#34;#actionmapping&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;p&gt;&lt;code&gt;com.palmyralabs.palmyra.base.annotations.ActionMapping&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;Binds a handler component to one or more action names/URLs — used for non-CRUD RPC-style endpoints. Target: &lt;code&gt;TYPE&lt;/code&gt;. Retention: &lt;code&gt;RUNTIME&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;attributes&#34;&gt;Attributes&lt;a class=&#34;anchor&#34; href=&#34;#attributes&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;Attribute&lt;/th&gt;&#xA;          &lt;th&gt;Signature&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;value&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;String[] value()&lt;/code&gt; — URL path(s); alias for &lt;code&gt;path&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;path&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;String[] path() default {}&lt;/code&gt; — alias for &lt;code&gt;value&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;action&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;String[] action() default {}&lt;/code&gt; — action name(s)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h2 id=&#34;example&#34;&gt;Example&lt;a class=&#34;anchor&#34; href=&#34;#example&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;@Component&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;@ActionMapping&lt;/span&gt;(value &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/v1/admin/user&amp;#34;&lt;/span&gt;, action &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; {&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;reset-password&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;enable&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;disable&amp;#34;&lt;/span&gt;})&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;UserAdminActions&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// ...&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>@Permission</title>
      <link>https://palmyra.dev/docs/api/backend/annotations/permission/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://palmyra.dev/docs/api/backend/annotations/permission/</guid>
      <description>&lt;h1 id=&#34;permission&#34;&gt;@Permission&lt;a class=&#34;anchor&#34; href=&#34;#permission&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;p&gt;&lt;code&gt;com.palmyralabs.palmyra.base.annotations.Permission&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;Declares the permission keys required to invoke a handler&amp;rsquo;s operations. Target: &lt;code&gt;TYPE&lt;/code&gt;. Retention: &lt;code&gt;RUNTIME&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Use &lt;code&gt;cruds&lt;/code&gt; to assign a single permission across all CRUD operations, or set per-operation keys individually.&lt;/p&gt;&#xA;&lt;h2 id=&#34;how-these-keys-are-evaluated&#34;&gt;How these keys are evaluated&lt;a class=&#34;anchor&#34; href=&#34;#how-these-keys-are-evaluated&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Palmyra feeds each &lt;code&gt;@Permission&lt;/code&gt; value through the &lt;strong&gt;standard Spring &lt;code&gt;PermissionEvaluator&lt;/code&gt;&lt;/strong&gt; registered in the application context — the same mechanism &lt;code&gt;@PreAuthorize(&amp;quot;hasPermission(...)&amp;quot;)&lt;/code&gt; uses. This makes the authorization policy pluggable at the framework level:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;With the default &lt;a href=&#34;https://palmyra.dev/docs/api/backend/extensions/acl-management/palmyra-permission-evaluator/&#34;&gt;&lt;code&gt;PalmyraPermissionEvaluator&lt;/code&gt;&lt;/a&gt; (shipped by &lt;code&gt;palmyra-dbacl-mgmt&lt;/code&gt;), the keys resolve against the ACL tables.&lt;/li&gt;&#xA;&lt;li&gt;Register your own &lt;code&gt;PermissionEvaluator&lt;/code&gt; bean — Keycloak/OPA bridge, in-house RBAC, remote SaaS — and the &lt;strong&gt;same&lt;/strong&gt; &lt;code&gt;@Permission&lt;/code&gt; keys resolve through your policy engine without touching handler code.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;attributes&#34;&gt;Attributes&lt;a class=&#34;anchor&#34; href=&#34;#attributes&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;Attribute&lt;/th&gt;&#xA;          &lt;th&gt;Signature&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;value&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;String value()&lt;/code&gt; — permission name/key&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;cruds&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;String cruds() default &amp;quot;&amp;quot;&lt;/code&gt; — combined CRUD permission&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;read&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;String read() default &amp;quot;&amp;quot;&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;query&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;String query() default &amp;quot;&amp;quot;&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;create&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;String create() default &amp;quot;&amp;quot;&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;update&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;String update() default &amp;quot;&amp;quot;&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;delete&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;String delete() default &amp;quot;&amp;quot;&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;export&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;String[] export() default {}&lt;/code&gt; — export permission(s)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h2 id=&#34;example&#34;&gt;Example&lt;a class=&#34;anchor&#34; href=&#34;#example&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;@Component&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;@CrudMapping&lt;/span&gt;(value &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/v1/admin/user&amp;#34;&lt;/span&gt;, type &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; User.&lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;@Permission&lt;/span&gt;(&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    value  &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;USER&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    query  &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;USER_READ&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    create &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;USER_CREATE&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    update &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;USER_UPDATE&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    delete &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;USER_DELETE&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    export &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; {&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;USER_EXPORT&amp;#34;&lt;/span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;UserCrudHandler&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;implements&lt;/span&gt; CrudHandler {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>@PalmyraMappingConfig</title>
      <link>https://palmyra.dev/docs/api/backend/annotations/palmyra-mapping-config/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://palmyra.dev/docs/api/backend/annotations/palmyra-mapping-config/</guid>
      <description>&lt;h1 id=&#34;palmyramappingconfig&#34;&gt;@PalmyraMappingConfig&lt;a class=&#34;anchor&#34; href=&#34;#palmyramappingconfig&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;p&gt;&lt;code&gt;com.palmyralabs.palmyra.base.annotations.PalmyraMappingConfig&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;Declares application-managed &lt;strong&gt;unique-key&lt;/strong&gt; and &lt;strong&gt;foreign-key&lt;/strong&gt; constraints for a type. Target: &lt;code&gt;TYPE&lt;/code&gt;. Retention: &lt;code&gt;RUNTIME&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;when-you-need-it&#34;&gt;When you need it&lt;a class=&#34;anchor&#34; href=&#34;#when-you-need-it&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;By default Palmyra discovers table relationships from &lt;strong&gt;JDBC metadata&lt;/strong&gt; (or a custom schema-introspection query) — it reads primary keys, unique constraints and foreign keys straight off the database. You don&amp;rsquo;t write this annotation for normally-constrained schemas.&lt;/p&gt;&#xA;&lt;p&gt;Reach for &lt;code&gt;@PalmyraMappingConfig&lt;/code&gt; when those constraints are &lt;strong&gt;managed in the application&lt;/strong&gt;, not the database:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;A shared/read-only schema where you can&amp;rsquo;t add FK or unique constraints.&lt;/li&gt;&#xA;&lt;li&gt;Legacy tables where the data modelling is enforced by application code only.&lt;/li&gt;&#xA;&lt;li&gt;Views or staging tables that deliberately omit physical constraints for performance or flexibility reasons.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Declaring the constraints here tells Palmyra to treat them as real — identity lookups (pre-insert existence check, &lt;a href=&#34;https://palmyra.dev/docs/api/backend/handlers/save-handler/&#34;&gt;&lt;code&gt;SaveHandler&lt;/code&gt;&lt;/a&gt; upsert, unique-violation detection) honour the declared unique keys, and joined-attribute resolution (see &lt;a href=&#34;https://palmyra.dev/docs/api/backend/annotations/palmyra-field/#flattening-with-parentref&#34;&gt;&lt;code&gt;@PalmyraField.parentRef&lt;/code&gt;&lt;/a&gt;) follows the declared foreign keys.&lt;/p&gt;</description>
    </item>
    <item>
      <title>@PalmyraUniqueKey</title>
      <link>https://palmyra.dev/docs/api/backend/annotations/palmyra-unique-key/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://palmyra.dev/docs/api/backend/annotations/palmyra-unique-key/</guid>
      <description>&lt;h1 id=&#34;palmyrauniquekey&#34;&gt;@PalmyraUniqueKey&lt;a class=&#34;anchor&#34; href=&#34;#palmyrauniquekey&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;p&gt;&lt;code&gt;com.palmyralabs.palmyra.base.annotations.PalmyraUniqueKey&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;Declares a (composite) unique key over one or more fields. Target: &lt;code&gt;TYPE&lt;/code&gt;. Retention: &lt;code&gt;CLASS&lt;/code&gt; — consumed only through &lt;a href=&#34;https://palmyra.dev/docs/api/backend/annotations/palmyra-mapping-config/&#34;&gt;&lt;code&gt;@PalmyraMappingConfig.uniqueKeys&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;attributes&#34;&gt;Attributes&lt;a class=&#34;anchor&#34; href=&#34;#attributes&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;Attribute&lt;/th&gt;&#xA;          &lt;th&gt;Signature&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;fields&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;String[] fields() default {}&lt;/code&gt; — fields composing the unique key&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h2 id=&#34;example&#34;&gt;Example&lt;a class=&#34;anchor&#34; href=&#34;#example&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;@PalmyraMappingConfig&lt;/span&gt;(&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    type &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;User&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    uniqueKeys &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;@PalmyraUniqueKey&lt;/span&gt;(fields &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; {&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;tenantId&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;loginName&amp;#34;&lt;/span&gt;})&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;User&lt;/span&gt; { }&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>@PalmyraForeignKey</title>
      <link>https://palmyra.dev/docs/api/backend/annotations/palmyra-foreign-key/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://palmyra.dev/docs/api/backend/annotations/palmyra-foreign-key/</guid>
      <description>&lt;h1 id=&#34;palmyraforeignkey&#34;&gt;@PalmyraForeignKey&lt;a class=&#34;anchor&#34; href=&#34;#palmyraforeignkey&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;p&gt;&lt;code&gt;com.palmyralabs.palmyra.base.annotations.PalmyraForeignKey&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;Declares a foreign-key relationship to another Palmyra type. Target: &lt;code&gt;TYPE&lt;/code&gt;. Retention: &lt;code&gt;CLASS&lt;/code&gt; — consumed only through &lt;a href=&#34;https://palmyra.dev/docs/api/backend/annotations/palmyra-mapping-config/&#34;&gt;&lt;code&gt;@PalmyraMappingConfig.foreignKeys&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;attributes&#34;&gt;Attributes&lt;a class=&#34;anchor&#34; href=&#34;#attributes&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;Attribute&lt;/th&gt;&#xA;          &lt;th&gt;Signature&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;name&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;String name()&lt;/code&gt; — FK name&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;targetType&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;String targetType() default &amp;quot;&amp;quot;&lt;/code&gt; — referenced entity type&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;targetReference&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;String targetReference()&lt;/code&gt; — reference identifier on the target&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;sourceFields&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;String[] sourceFields() default {}&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;targetFields&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;String[] targetFields() default {}&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h2 id=&#34;example&#34;&gt;Example&lt;a class=&#34;anchor&#34; href=&#34;#example&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;@PalmyraMappingConfig&lt;/span&gt;(&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    type &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Order&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    foreignKeys &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;@PalmyraForeignKey&lt;/span&gt;(&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            name &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;fk_order_user&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            targetType &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;User&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            targetReference &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;user&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            sourceFields &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; {&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;userId&amp;#34;&lt;/span&gt;},&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            targetFields &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; {&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        )&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Order&lt;/span&gt; { }&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>@FetchConfig</title>
      <link>https://palmyra.dev/docs/api/backend/annotations/fetch-config/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://palmyra.dev/docs/api/backend/annotations/fetch-config/</guid>
      <description>&lt;h1 id=&#34;fetchconfig&#34;&gt;@FetchConfig&lt;a class=&#34;anchor&#34; href=&#34;#fetchconfig&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;p&gt;&lt;code&gt;com.palmyralabs.palmyra.base.annotations.FetchConfig&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;Controls how much of a &lt;strong&gt;parent&lt;/strong&gt; (referenced) object is fetched when its owning row is read. Target: &lt;code&gt;FIELD&lt;/code&gt;. Retention: &lt;code&gt;RUNTIME&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;blockquote class=&#39;book-hint &#39;&gt;&#xA;&lt;p&gt;&lt;strong&gt;Applies to parent references only.&lt;/strong&gt; &lt;code&gt;@FetchConfig&lt;/code&gt; has no effect on child collections — child attributes are always fetched under the current framework behaviour. Apply the annotation to the field that holds the parent/FK reference.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&lt;h2 id=&#34;attributes&#34;&gt;Attributes&lt;a class=&#34;anchor&#34; href=&#34;#attributes&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;Attribute&lt;/th&gt;&#xA;          &lt;th&gt;Signature&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;fetchMode&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;FetchMode fetchMode() default FetchMode.ALL&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h2 id=&#34;fetchmode&#34;&gt;&lt;code&gt;FetchMode&lt;/code&gt;&lt;a class=&#34;anchor&#34; href=&#34;#fetchmode&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;code&gt;com.palmyralabs.palmyra.base.format.FetchMode&lt;/code&gt;&lt;/p&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;Constant&lt;/th&gt;&#xA;          &lt;th&gt;Wire value&lt;/th&gt;&#xA;          &lt;th&gt;What comes back from the parent&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;ALL&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;&amp;quot;all&amp;quot;&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Every attribute of the parent (default)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;PRIMITIVE_FIELDS&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;&amp;quot;primitive&amp;quot;&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Scalar / primitive columns only — no nested references&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;KEY_FIELDS&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;&amp;quot;keyfield&amp;quot;&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Just the fields flagged as key (&lt;code&gt;@PalmyraField(keyField = true)&lt;/code&gt; / primary key)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;PRIMITIVE_OR_KEY_FIELDS&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;&amp;quot;primitive_key&amp;quot;&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Union of the two — primitives plus key fields&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;Use &lt;code&gt;PRIMITIVE_OR_KEY_FIELDS&lt;/code&gt; when the UI needs a display label (a primitive name/code) plus an id (a key field), but no further joins. Use &lt;code&gt;KEY_FIELDS&lt;/code&gt; when only the id is needed — useful for light-weight list payloads.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
