Cria, revisa e refatora entidades Java `@JapeEntity` Sankhya — Lombok (`@Data`/`@NoArgsConstructor`/`@AllArgsConstructor`), PK simples/composta com `@Embeddable`, `@Column`, `@Id`, `@JoinColumn`, `@OneToMany`/`@OneToOne`/`@ManyToOne`, `@Relationship`, naming `<PRX><MOD3><CTX>`, mapeamento de tipos (`Integer`/`BigDecimal`/`String`/`Boolean`/`Date`/`Timestamp`). Use ao criar, alterar, revisar, auditar ou padronizar entidades, ao modelar a classe de dados de uma spec/tabela, ou ao tocar em código com `@JapeEntity`.
Instalação
Instalar com Codex ou Claude Copie este prompt, cole no Codex, Claude ou outro assistente e deixe que ele revise a página da skill e instale para você.
Cria, revisa e refatora entidades Java `@JapeEntity` Sankhya — Lombok (`@Data`/`@NoArgsConstructor`/`@AllArgsConstructor`), PK simples/composta com `@Embeddable`, `@Column`, `@Id`, `@JoinColumn`, `@OneToMany`/`@OneToOne`/`@ManyToOne`, `@Relationship`, naming `<PRX><MOD3><CTX>`, mapeamento de tipos (`Integer`/`BigDecimal`/`String`/`Boolean`/`Date`/`Timestamp`). Use ao criar, alterar, revisar, auditar ou padronizar entidades, ao modelar a classe de dados de uma spec/tabela, ou ao tocar em código com `@JapeEntity`.
Entidade Java = representação domínio de tabela banco. Limpa — contém só mapeamento estrutural mínimo. Metadata UI, tipos, descrições, comportamento fica no Dicionário de Dados (XMLs em datadictionary/).
Referência complementar: consulte data-dictionary para criar XML correspondente à entidade.
Antes criar entidade nova: (1) inspecionar projeto pra detectar <PRX> existente; (2) se ausente, perguntar dev <PRX> + <MOD3> + <CTX>; (3) confirmar entity + table final.
NOTA: exemplos seguintes usam TDC como prefixo ilustrativo. Substituir pelo <PRX> real do projeto.
1.2 Tabelas e Instâncias Nativas Sankhya (isNativeTable / isNativeInstance)
@JapeEntity aceita dois flags para sinalizar quando a tabela e/ou a instância já existem no Sankhya nativo. Os dois flags são independentes e cobrem 3 cenários:
Cenário
isNativeTable
isNativeInstance
Tag XML correspondente
Tabela addon + Instância addon
omitir
omitir
<table> + <instance>
Tabela nativa + Instância nova do addon
true
omitir
<nativeTable> + <instance>
Tabela nativa + Instância nativa
true
true
<nativeTable> + <nativeInstance>
Por que isso importa: sem isNativeTable, o KSP rejeita a compilação com erro de entidade duplicada ao detectar que a tabela já existe. Sem isNativeInstance em uma instância nativa, a instância é regravada no metadata.xml gerado e, durante o deploy do addon, o dicionário a re-mapeia para o owner do addon — quebrando todas as regras, validações e telas nativas que dependem dessa instância.
// 1) Tabela e instância do addon — sem flags@JapeEntity(entity = "TdcXyzCabecalho", table = "TDCXYZCAB")publicclassTdcXyzCabecalho { ... }
// 2) Tabela nativa, instância NOVA do addon — só isNativeTable@JapeEntity(entity = "TdcXyzDefensivos", table = "TGFDFAGR", isNativeTable = true)publicclassTdcXyzDefensivos { ... }
// 3) Tabela e instância nativas — os dois flags@JapeEntity(entity = "CabecalhoNota", table = "TGFCAB",
isNativeTable = true, isNativeInstance = true)publicclassCabecalhoNota { ... }
Regra prática: se o entity for um nome usado pelo Sankhya nativo (CabecalhoNota, ItemNota, Parceiro, Produto, etc.), use isNativeInstance = true. Se o entity segue a convenção Tdc<Modulo><Contexto> do addon, é instância nova — não use isNativeInstance.
2. Organizacao
Skill nao opina sobre estrutura de pacotes. Organize entidades, Enums, PKs compostas, classes de dominio puro conforme arquitetura do seu projeto.
Tipos de classe que aparecem aqui:
Tipo
Caracteristica
Entidade persistida (@JapeEntity)
Mapeia tabela do banco
PK composta (@Embeddable)
Classe que agrupa colunas-chave de uma PK composta
Enum (Value Object)
Valores finitos persistidos como texto curto
Classe sem persistencia
Conceito de negocio, sem @JapeEntity (@Data + factory methods)
3. Tipos de Classe no Domínio
3.1 Entidade Persistida (@JapeEntity)
Representa tabela no banco. Tem @JapeEntity, @Id, @Column, opcionalmente relacionamentos.
import br.com.sankhya.studio.persistence.*; // 1. Imports de persistênciaimport lombok.*; // 2. Imports Lombok@Data// 3. Lombok obrigatório@NoArgsConstructor@AllArgsConstructor@JapeEntity( // 4. Mapeamento: somente entity + table
entity = "NomeDaEntidade",
table = "NOME_TABELA"
)publicclassNomeDaEntidade { // 5. Classe plana (sem herança de metadata)@Id// 6. Chave primária@Column(name = "COLUNA_PK")private Integer id;
@Column(name = "COLUNA_1")// 7. Campos: somente nameprivate String campo1;
@OneToMany(...)// 9. Relacionamentos (se houver)private List<EntidadeFilha> filhos;
publicvoidmetodoDeNegocio() { ...} // 10. Métodos de domínio (se houver)
}
5. Anotações Permitidas
Anotações que DEVEM ser usadas
Anotação
Uso
Pacote
@JapeEntity(entity, table)
Toda entidade persistida
br.com.sankhya.studio.persistence
@Id
Campo(s) de chave primária
br.com.sankhya.studio.persistence
@Column(name)
Todo campo persistido
br.com.sankhya.studio.persistence
@Embeddable
Classe de PK composta
br.com.sankhya.studio.persistence
@Data
Getter/Setter/ToString/Equals/Hash
lombok
@NoArgsConstructor
Construtor vazio (obrigatório para o framework)
lombok
@AllArgsConstructor
Construtor com todos os campos
lombok
Anotações opcionais (usar quando necessário)
Anotação
Quando usar
Pacote
@Builder
Quando a entidade é construída programaticamente no domínio
lombok
@OneToMany
Relacionamento pai -> filhos
br.com.sankhya.studio.persistence
@OneToOne
Navegação para entidade referenciada
br.com.sankhya.studio.persistence
@ManyToOne
Navegação inversa filho -> pai
br.com.sankhya.studio.persistence
@JoinColumn(name, referencedColumnName)
Junto com @OneToOne / @ManyToOne
br.com.sankhya.studio.persistence
@JoinColumns
Múltiplos @JoinColumn (FK composta)
br.com.sankhya.studio.persistence
@Cascade
Dentro de @OneToMany para cascatear operações
br.com.sankhya.studio.persistence
@Relationship
Dentro de @OneToMany para definir campos do vínculo
br.com.sankhya.studio.persistence
@SuperBuilder
Quando a entidade herda de classe base de domínio (ex: VO com campos comuns)
lombok.experimental
@EqualsAndHashCode(callSuper = true)
Junto com herança + @SuperBuilder
lombok
Anotações PROIBIDAS na entidade
Anotação
Onde fica
Motivo
@Expression
XML <expression>
Metadata do framework
@GeneratedValue
XML sequenceType/sequenceField
Metadata do framework
@Option
XML <fieldOptions>
Metadata de UI
@Property
XML
Metadata do framework
6. Chave Primária (PK)
Padrões de chave primária — @Id em PK simples (Integer ou BigDecimal conforme tabela addon vs nativa) e PK composta via @Embeddable com convenções e métodos auxiliares — em references/primary-key.md.
Tutorial completo (criar XML do dicionário → entidade Java → @Embeddable se PK composta → enum se aplicável → validar) usando exemplo TdcXyzFornecedor — em references/walkthrough.md.
13. Exemplos Completos
Entidades completas — PK simples, PK composta + relacionamentos, @OneToMany (pai com filhos), entidade nativa com @Builder + métodos de domínio, entidade só com PK composta, enum, classe @Embeddable — em references/examples.md.
14. Checklist
Criando uma entidade nova
Criar XML dicionário em datadictionary/<TABELA>.xml (ver data-dictionary).
Criar classe Java conforme arquitetura do projeto.
Anotar com @Data, @NoArgsConstructor, @AllArgsConstructor.
Anotar com @JapeEntity(entity = "...", table = "..."). Tabela nativa Sankhya (TGFCAB, TGFFIN, TGFORD, etc.): adicionar isNativeTable = true. Instância também nativa (entity = CabecalhoNota, Parceiro, Produto, etc.): adicionar também isNativeInstance = true. Ver seção 1.2.
Definir PK com @Id + @Column(name) (simples) ou @Id + classe @Embeddable (composta).
Cada campo persistido com @Column(name = "...") — só name.
Tipo Java correto para cada campo (ver tabela tipos).
Anotar com @Data, @AllArgsConstructor, @NoArgsConstructor, @Embeddable.
Cada campo com @Column(name = "...") — só name.
Na entidade, campo anotado só com @Id (sem @Column).
15. Erros Comuns
Erro
Correção
Colocar description, dataType, size no @Column
Somente name. Metadata fica no XML.
Colocar @GeneratedValue no @Id
Sequência fica no XML (sequenceType/sequenceField).
Colocar @Expression no campo
Expressões ficam no XML (<expression>).
Omitir isNativeTable = true em tabela nativa Sankhya
Obrigatório para TGFCAB, TGFFIN, TGFORD, TGFVEI, TGFEMP, TGFPAR — KSP rejeita sem ele com erro de entidade duplicada.
Omitir isNativeInstance = true em instância nativa
Obrigatório quando o entity reusa um nome nativo (CabecalhoNota, Parceiro, Produto, etc.). Sem ele, o deploy regrava a instância para o owner do addon e quebra regras/validações nativas.
Criar @OneToOne quando só precisa do valor da FK
Use @Column(name = "FK") se não precisa navegar.
Esquecer de criar o XML do dicionário
Toda entidade precisa do XML correspondente.
Esquecer @NoArgsConstructor
Obrigatório para o framework instanciar a entidade.
Usar String para campo CHECKBOX
Use Boolean — o framework converte S/N automaticamente.
Usar Integer para PKs nativas (NUNOTA, CODPARC)
Use BigDecimal — padrão do Sankhya Om.
Skills relacionadas
data-dictionary — XML do dicionário de dados que descreve a tabela mapeada por esta entidade
database — dbscript V<NNN>-*.xml que cria a tabela física no MSSQL/Oracle
repository — interface JapeRepository que opera sobre esta entidade