Como Utilizar Mapeamento JPA Com Chave Composta por FK's

3 respostas
Aurelios

Pessoal tenho a tabela de Atestados que possui Cids
porém na tabela de cid possui uma chave composta com 5 foreigns keys de Atestados (cd_empresa,cd_matricula,dt_atestado,tp_atestado,nr_atestado)
É eu sei... seria muito mais facil ter a Pk de Atestado como FK.... porém não posso alterar o banco....
pesquisei e achei alguns tópicos porém só com chave compostas com Pks
então gostaria que me dessem um help....

Segundo o que eu li eu deveria criar uma classe com as FKS segue exemplo embaixo
e botar um @EmbeddedId private AtestadoFk atestadofk; na classe Cid....
[color=red]Só que como fica o ManyToOne com Atestado ? não consigo entender....[/color]

AtestadoFK
public class AtestadoFk {

     @Column(name = "cd_empresa", nullable = false, length = 6)
    private Long codigoEmpresa;

    @Column(name = "cd_matricula", nullable = false, length = 10)
    private Long codigoMatricula;

    @Column(name = "tp_atestado", nullable = false, length = 10)
    private Long tipoAtestado;

    @Column(name = "dt_atestado", nullable = false)
    @Temporal(javax.persistence.TemporalType.DATE)
    private Date dataAtestado;

    @Column(name = "nr_atestado", nullable = false, length = 11)
    private Long numeroAtestado;

}
Atestado
@Entity
@Table(name = "ATEST_MEDICOS")
@SequenceGenerator(name = "SE__ATESTADO_MEDICO", sequenceName = "SE_ATESTADO_MEDICO")
public class Atestado implements  Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "SE_ATESTADO_MEDICO")
    @Column(name = "oid_atestado", nullable = false)
    private Long id;

    @SuppressWarnings("unchecked")
    @OneToMany(targetEntity = Cid.class, cascade = CascadeType.ALL, mappedBy = "atestadoMedico",fetch=FetchType.EAGER) 
    private Set<Cid> atestadoMedicoCid;

    @Column(name = "cd_empresa", nullable = false, length = 6)
    private Long codigoEmpresa;

    @Column(name = "cd_matricula", nullable = false, length = 10)
    private Long codigoMatricula;

    @Column(name = "tp_atestado", nullable = false, length = 10)
    private Long tipoAtestado;

    @Column(name = "dt_atestado", nullable = false)
    @Temporal(javax.persistence.TemporalType.DATE)
    private Date dataAtestado;
    
    @Column(name = "nr_atestado", nullable = false, length = 11)
    private Long numeroAtestado;
Cid
@Entity
@Table(name = "ATEST_MEDICOS_CID")
@SequenceGenerator(name = "SE_ATESTADO_MEDICO_CID", sequenceName = "SE_ATESTADO_MEDICO_CID")
public class Cid implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "SE_ATESTADO_MEDICO_CID")
    @Column(name = "oid_atestado_cid", nullable = false, length = 5)
    private Long id;
    
    @SuppressWarnings("unchecked")
    @ManyToOne(targetEntity = Atestado.class, cascade=javax.persistence.CascadeType.ALL,fetch = FetchType.LAZY)
    private Atestado atestadoMedico;
  
 @Column(name = "doenca", nullable = false, length = 60)
        private String doenca;

 @EmbeddedId
 private AtestadoFk atestadofk;

3 Respostas

L

ve se ajuda

http://www.guj.com.br/posts/list/82951.java

Aurelios

Poderia me corrigir se eu estiver errado ?
PS: Eu não consigo resolver isso com um relacionamento Bidirecional ?
então ficaria assim ?

AtestadoFk
public class AtestadoFk {

  @SuppressWarnings("unchecked")
    @ManyToOne(targetEntity = Atestado.class, cascade=javax.persistence.CascadeType.ALL,fetch = FetchType.LAZY)
    @JoinColumns({@JoinColumn(name="cd_empresa",referencedColumnName="cd_empresa"),
    @JoinColumn(name="cd_matricula",referencedColumnName="cd_matricula"),
    @JoinColumn(name="tp_atestado",referencedColumnName="tp_atestado"),
    @JoinColumn(name="dt_atestado",referencedColumnName="dt_atestado"),
    @JoinColumn(name="nr_atestado",referencedColumnName="nr_atestado")})
    private Atestado atestadoMedico;

}
Cid
@Entity
@Table(name = "HISTORICOS_ATEST_MEDICOS_CID")
@SequenceGenerator(name = "SE_HISTORICO_ATESTADO_MEDICO_CID", sequenceName = "SE_HISTORICO_ATESTADO_MEDICO_CID")
public class Cid implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "SE_ATESTADO_MEDICO")
    @Column(name = "oid_atestado_cid", nullable = false, length = 5)
    private Long id;

    @EmbeddedId
    private AtestadoFk atestadofk;

    @Column(name = "doenca", nullable = false, length = 60)
    private String doenca;
Atestado
@Entity
@Table(name = "ATEST_MEDICOS")
@SequenceGenerator(name = "SE__ATESTADO_MEDICO", sequenceName = "SE_ATESTADO_MEDICO")
public class Atestado implements  Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "SE_ATESTADO_MEDICO")
    @Column(name = "oid_atestado", nullable = false)
    private Long id;

    @SuppressWarnings("unchecked")
    @OneToMany(targetEntity = Cid.class, cascade = CascadeType.ALL, mappedBy = "historicoAtestadoMedico",fetch=FetchType.EAGER) 
    private Set<Cid> historicoAtestadoMedicoCid;

    @Column(name = "cd_empresa", nullable = false, length = 6)
    private Long codigoEmpresa;

    @Column(name = "cd_matricula", nullable = false, length = 10)
    private Long codigoMatricula;

    @Column(name = "tp_atestado", nullable = false, length = 10)
    private Long tipoAtestado;

    @Column(name = "dt_atestado", nullable = false)
    @Temporal(javax.persistence.TemporalType.DATE)
    private Date dataAtestado;
    
    @Column(name = "nr_atestado", nullable = false, length = 11)
    private Long numeroAtestado;
Aurelios

Valeu pessoal, resolvi apenas usando relacionamento bidirecional

Criado 3 de agosto de 2010
Ultima resposta 4 de ago. de 2010
Respostas 3
Participantes 2