Chave Composta em OneToMany

2 respostas
K

Ola pessoal

tenho um relacionamento oneToMany Bidirecional entre Questionario e QuestionarioItem
na classe QuestionarioItem possui uma chave composta que é formado pelo id do item + o id do questionario
quando mando o hibernate pra criar o banco ele cria uma terceira tabela

tabelas:
Questionario | Questionario_QUEST_ITEM | Quest_item
id | que_id | id
| queit_id

teria uma maneira de eliminar essa tabela???

essas são minhas classes
@Embeddable
public class QuestionarioItemPK implements Serializable{

    @Column(name="queit_que_id", nullable=false)
    @Resolvable(colName="ID_QUEST")
    private Questionario questionarioId;

    @Column(name="queit_id", nullable=false)
    @Resolvable(colName="ID")
    private QuestionarioItem itemID;
@Entity
@Table(name="Quest_item", schema="Tecnicos")
public class QuestionarioItem implements Serializable {

  


    @EmbeddedId
    @Resolvable(colName="ID")
    private QuestionarioItemPK id;

    @Column(name="queit_ordem")
    @Resolvable(colName="ORDERM")
    private Integer ordem;

    @Column(name="queit_descricao", length=80)
    @Resolvable(colName="DESCRIÇÃO")
    private String descricao;

    @Column(name="queit_comentario", length=200)
    @Resolvable(colName="COMENTÁRIO")
    private String comentario;

    @Column(name="queit_requerido", length=20)
    @Resolvable(colName="REQUERIDO")
    private Boolean requerido;

    @Column(name="queit_vlrmin", length=45)
    @Resolvable(colName="VALOR MIN.")
    private String valorMin;

    @Column(name="queit_vlrmax", length=45)
    @Resolvable(colName="VALOR MAX.")
    private String valorMax;

    @ManyToOne(fetch=FetchType.EAGER)
    @JoinColumn(name="queit_que_id", insertable=true, updatable=true)
    @Fetch(FetchMode.JOIN)
    @Cascade(CascadeType.SAVE_UPDATE)
    @Resolvable(colName="QUESTIONÁRIO")
    private Questionario questionario;

    @OneToMany(mappedBy="quesItem")
    @Cascade(CascadeType.ALL)
    @Resolvable(colName="RESPOSTA")
    private Collection<QuestionarioResposta> resposta;
@Entity
@Table(name="Questionario", schema="Tecnicos")
public class Questionario implements Serializable {

    @Id
    @Column(name="que_id", nullable=false)
    @Resolvable(colName="ID")
    private Integer id;

    @Column(name="que_descricao", length=80)
    @Resolvable(colName="DESCRIÇÃO")
    private String descricao;

    @Column(name="que_requerido", length=20)
    @Resolvable(colName="REQUERIDO")
    private Boolean requerido;

    @Column(name="que_comentario", length=250)
    @Resolvable(colName="COMENTÁRIO")
    private String comentario;

    @Temporal(TemporalType.DATE)
    @Column(name="que_dataini")
    @Resolvable(colName="INICIA EM", formatter=DateFormatter.class)
    private Date dataInicio;

    @Temporal(TemporalType.DATE)
    @Column(name="que_datafim")
    @Resolvable(colName="FINALIZA EM", formatter=DateFormatter.class)
    private Date dataFim;
    
    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="que_emp_id", insertable=true, updatable=true)
    @Fetch(FetchMode.JOIN)
    @Cascade(CascadeType.SAVE_UPDATE)
    @Resolvable(colName="EMPRESA")
    private Empresa empresa;

    @OneToMany(fetch=FetchType.LAZY)
    @Cascade(CascadeType.ALL)
    @Resolvable(colName="QUESTIONARIO ITEM")
    private Collection<QuestionarioItem> itens;

    @ManyToMany(fetch=FetchType.LAZY)
    @JoinTable(name="questionario_tecnico", schema="Tecnicos",
            joinColumns=@JoinColumn(name="ques_id"),
            inverseJoinColumns=@JoinColumn(name="tec_id"))
    @Cascade({CascadeType.SAVE_UPDATE, CascadeType.MERGE})
    @Resolvable(colName="TÉCNICOS")
    private Collection<Tecnicos> tecnicos;

    @ManyToMany(fetch=FetchType.LAZY)
    @JoinTable(name="questionario_cliente", schema="Tecnicos",
            joinColumns=@JoinColumn(name="que_id"),
            inverseJoinColumns=@JoinColumn(name="cli_id"))
    @Cascade({CascadeType.SAVE_UPDATE, CascadeType.MERGE})
    @Resolvable(colName="CLIENTE")
    private Collection<Cliente> clientes;

2 Respostas

R

Ola, @ksio_thadeu

Sim é só vc não utilizar a PK, geralmente utilizo PK’s em relacionamentos ManyToMany, quando tenho mais de um atributo na associativa.

Obs: Na parte do Questionário vc pode utilizar o “mappedBy”

@OneToMany(mappedBy="questionario", fetch=FetchType.LAZY)  
@Cascade(CascadeType.ALL)  
@Resolvable(colName="QUESTIONARIO ITEM")  
private Collection&lt;QuestionarioItem&gt; itens;

[]'s

K

Certo, eu estava fazendo dessa maneira, mais preciso de uma chave composta pois quero tipo:
Questionario1: item1, item2, item3
Questionario2: item1, item2, item3.
ai quando eu atualizava algum questionario ele atualizava as perguntas ja com chave composta funciona na insercao e atualizacao mais da pau quando eu faco remocao

Criado 9 de março de 2011
Ultima resposta 9 de mar. de 2011
Respostas 2
Participantes 2