🔄 AutoDD: Geração Automática do Dicionário de Dados (Data Dictionary)


⚠️

Acesso Antecipado (Beta)

Esta documentação refere-se a uma versão em acesso antecipado do SDK Sankhya. As funcionalidades e APIs estão sujeitas a modificações. Para obter acesso, envie um e-mail para [email protected] informando a appkey do seu projeto.


🔄 AutoDD: Geração Automática do Dicionário de Dados (Data Dictionary)

📝 O que é o AutoDD?

O AutoDD (Auto Data Dictionary) é uma feature do SDK Sankhya que gera automaticamente o dicionário de dados XML (data dictionary) a partir das suas entidades Java anotadas com @JapeEntity.

O dicionário de dados é o coração do ORM Jape da Sankhya: todas as entidades precisam ser mapeadas através dele para que o framework reconheça tabelas, campos, chaves e relacionamentos.

Com o AutoDD, o desenvolvedor não precisa mais criar manualmente arquivos XML para mapear suas entidades. Basta anotar corretamente a classe com @JapeEntity e os campos (@Id, @Column, etc.), e o framework gera o XML automaticamente durante o build.

O AutoDD não substitui o mapeamento manual de outras features como views, menus, dashboards, tree table, filters etc.
Ele é focado exclusivamente no mapeamento de Table e NativeTable.


🔗 Relação entre AutoDD e AutoDDL

  • AutoDD: Gera o dicionário de dados XML a partir das entidades Java.
  • AutoDDL: Converte o dicionário de dados XML (gerado pelo AutoDD ou manual) em scripts DDL (CREATE/ALTER) para Oracle/MSSQL.

Essas features são complementares:

  • O AutoDD elimina o trabalho manual de criar o XML.
  • O AutoDDL elimina o trabalho manual de converter o XML em DDL.

Para usar o fluxo completo, é necessário habilitar ambas as features no build.gradle da raiz do projeto:

addon {
    autoDD = true
    autoDDL = true
}

✨ Benefícios do AutoDD

  • Agilidade
    Não é mais necessário criar XMLs manualmente para mapear entidades
    (views, menus, dashboards etc. ainda precisam ser mapeados manualmente).

  • 🎯 Menos Erro Humano
    Reduz falhas comuns de digitação e inconsistências de tipos.

  • 📏 Padronização
    Garante que o modelo Java e o dicionário de dados estejam sempre sincronizados.

  • 🔄 Integração Total
    Permite uso imediato do AutoDDL para geração de scripts de banco.


⚙️ Como Funciona?

  1. Defina sua entidade usando @JapeEntity e anotações de campo (@Id, @Column, etc.).
  2. Habilite o AutoDD no build.gradle da raiz.
  3. Execute o build do projeto:
./gradlew clean deployAddon
  1. O AutoDD processa as entidades e gera automaticamente o XML na pasta de build.
  2. (Opcional) Se o AutoDDL estiver habilitado, o XML será convertido em scripts SQL DDL para Oracle/MSSQL.

💡 Exemplo Prático

1️⃣ Entidade Simples

@Data
@NoArgsConstructor
@JapeEntity(
    entity = "TST_MinhaClasse",
    table = "TST_MINHA_CLASSE",
    description = "Minha Classe Exemplo"
)
public class MinhaClasse {

    @Id
    @GeneratedValue(strategy = GeneratedValue.GenerationType.AUTO)
    @Column(name = "ID", dataType = DataType.INTEGER, description = "Id")
    private Long id;

    @Column(name = "MSG", dataType = DataType.TEXT, description = "Mensagem")
    private String mensagem;

    @Column(name = "OUTRO_FIELD", dataType = DataType.INTEGER, description = "Outro Campo")
    private Long outroField;
}

2️⃣ Entidades com Relacionamentos

O AutoDD mapeia relacionamentos usando:

  • @JoinColumn (PK simples)
  • @JoinColumns (PK composta)

🔹 Relacionamento com PK Simples

@Data
@NoArgsConstructor
@JapeEntity(
    entity = "TST_MinhaClasse",
    table = "TST_MINHA_CLASSE",
    description = "Minha Classe Exemplo"
)
public class MinhaClasse {

    @Id
    @GeneratedValue(strategy = GeneratedValue.GenerationType.AUTO)
    @Column(name = "ID", dataType = DataType.INTEGER, description = "Id")
    private Long id;

    @Column(name = "MSG", dataType = DataType.TEXT, description = "Mensagem")
    private String mensagem;

    @OneToMany(
        cascade = Cascade.ALL,
        orphanRemovalStrategy = OrphanRemovalStrategy.DETACH
    )
    private List<MinhaOutraClasse> itens;
}
@Data
@NoArgsConstructor
@JapeEntity(
    entity = "TST_MinhaOutraClasse",
    table = "TST_MINHA_OUTRA_CLASSE",
    description = "Minha Outra Classe Exemplo"
)
public class MinhaOutraClasse {

    @Id
    @GeneratedValue(strategy = GeneratedValue.GenerationType.AUTO)
    @Column(name = "ID", dataType = DataType.INTEGER, description = "Id")
    private Long id;

    @Column(
        name = "STATUS",
        dataType = DataType.LIST,
        description = "STATUS",
        options = {
            @Option(label = "Ativo", value = "ATIVO"),
            @Option(label = "Inativo", value = "INATIVO")
        }
    )
    private Status status;

    @ManyToOne(cascade = Cascade.MERGE)
    @JoinColumn(
        name = "MINHA_ENTIDADE_ID",
        referencedColumnName = "ID",
        dataType = DataType.INTEGER,
        description = "Referência para MinhaClasse"
    )
    private MinhaClasse minhaClasse;
}

📋 Boas Práticas

  • Use prefixos exclusivos para tabelas e entidades (ex: SGT_, LOG_)
  • ❌ Nunca use prefixo AD_ (reservado do sistema)
  • Sempre revise scripts antes de aplicar em produção