🔗 Foreign Keys Compostas

🔗 Foreign Keys Compostas

⚠️

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.


📝 O que são Foreign Keys Compostas?

Foreign Keys Compostas são chaves estrangeiras formadas por múltiplas colunas que referenciam uma chave primária composta de outra tabela. O SDK Sankhya oferece suporte através das anotações @JoinColumn e @JoinColumns.

⚠️

IMPORTANTE: @JoinColumn e @JoinColumns são APENAS para @ManyToOne e @OneToOne.

Para @OneToMany, use o atributo relationship da própria anotação.

RelacionamentoMapeamento de Colunas
@ManyToOne@JoinColumn ou @JoinColumns
@OneToOne@JoinColumn ou @JoinColumns
@OneToManyrelationship = {@Relationship(...)}

🔧 Sintaxe

@JoinColumn (FK Simples)

@ManyToOne
@JoinColumn(
    name = "CODPARC",                   // Coluna FK na tabela local
    referencedColumnName = "CODPARC",   // Coluna PK na tabela referenciada
    description = "Código do Parceiro"  // Obrigatório com autoDD
)
private Parceiro parceiro;

@JoinColumns (FK Composta)

@ManyToOne
@JoinColumns({
    @JoinColumn(name = "NUNOTA", referencedColumnName = "NUNOTA", description = "Num. Nota"),
    @JoinColumn(name = "SEQUENCIA", referencedColumnName = "SEQUENCIA", description = "Sequencia Item")
})
private ItemNota itemNota;

💡 Exemplos Práticos

Exemplo 1: PK Simples referenciando PK Composta

@JapeEntity(entity = "ChaveSimples", table = "TB_CHAVE_SIMPLES")
public class ChaveSimples {
    @Id
    @Column(name = "ID")
    private Long id;
    
    @OneToOne
    @JoinColumns({
        @JoinColumn(name = "FK_COL1", referencedColumnName = "COL1", description = "Coluna 1"),
        @JoinColumn(name = "FK_COL2", referencedColumnName = "COL2", description = "Coluna 2")
    })
    private ChaveComposta chaveComposta;
}

@Embeddable
public class ChaveCompostaId implements Serializable {
    @Column(name = "COL1")
    private Long col1;
    
    @Column(name = "COL2")
    private Long col2;
}

@JapeEntity(entity = "ChaveComposta", table = "TB_CHAVE_COMPOSTA")
public class ChaveComposta {
    @Id
    private ChaveCompostaId id;
}

Exemplo 2: PK Composta referenciando PK Composta

@Embeddable
public class ChaveComposta2Id implements Serializable {
    @Column(name = "COL1")
    private Long col1;
    
    @Column(name = "COL2")
    private Long col2;
}

@JapeEntity(entity = "ChaveComposta2", table = "TB_CHAVE_COMPOSTA_2")
public class ChaveComposta2 {
    @Id
    private ChaveComposta2Id id;
    
    @ManyToOne
    @JoinColumns({
        @JoinColumn(name = "FK_TB1_COL1", referencedColumnName = "COL1", description = "FK Col1"),
        @JoinColumn(name = "FK_TB1_COL2", referencedColumnName = "COL2", description = "FK Col2")
    })
    private ChaveComposta1 chaveComposta1;
}

Exemplo 3: @OneToMany com Pai de PK Composta

@Embeddable
public class PaiId implements Serializable {
    @Column(name = "COL1")
    private Long col1;
    
    @Column(name = "COL2")
    private Long col2;
}

@JapeEntity(entity = "Pai", table = "TB_PAI")
public class Pai {
    @Id
    private PaiId id;
    
    @OneToMany(cascade = {Cascade.CREATE, Cascade.MERGE})
    private List<Filha> filhas;
}

@JapeEntity(entity = "Filha", table = "TB_FILHA")
public class Filha {
    @Id
    @Column(name = "ID")
    private Long id;
    
    @ManyToOne
    @JoinColumns({
        @JoinColumn(name = "FK_PAI_COL1", referencedColumnName = "COL1", description = "FK Pai Col1"),
        @JoinColumn(name = "FK_PAI_COL2", referencedColumnName = "COL2", description = "FK Pai Col2")
    })
    private Pai pai;
}

✅ Boas Práticas

  • Use nomes descritivos — CODEMP_CONTRATO melhor que EMP
  • Mantenha a mesma ordem em @JoinColumns e @Embeddable
  • Prefira Cascade.CREATE e Cascade.MERGE ao invés de Cascade.ALL