Hibernate Annotations - Criar 2 Tabelas relacionadas

Bom dia a todos,

estou estudando hibernate a algum tempo, e vi que o framework é otimo, porem, pra mim ainda e complicadio.

Minha duvida é a seguinte:

Tenho 1 tabela funcionario e outra colaboracao

Quero criar a tabela funcionario, e tambem criar uma relacao entre as 2, de modo que ao preencher a tabelas funcionari, a tabela colaboracao tb possa ser preenchida.

Como devo fazer isso com anotacoes ? Valeu =D

Primeiro, hibernate é complicado sim, mas não por que ele foi criado para ser e sim por que a maioria esquece que ele une vários conceitos, dos quais, dois são os principais, orientação a objetos e programação estruturada.
Como assim?
Os bancos de dados relacionais, como o MySQL, Oracle, MS SQL Server e Postgres usam conceitos estruturados. Enquanto que o java se baseia em OO. É esse o ponto de divergência.

Enfim, você pode relacionar duas tabelas, A e B de três formas:

  • Cada registro em A possui um e apenas um correspondente em B (relacionamento 1 : 1)
  • Cada registro em A possui vários correspondentes em B (relacionamento 1 : N)
  • Cada registro em A irá possuir vários registros em B e, por sua vez, cada registro de B possuirá vários registros em A (relacionamento N : N).

Assim sendo, primeiro você precisa definir qual a relação entre as classes (1 : 1, 1 : N ou N : N) e, então, poderemos te ajudar melhor.

Se você está estudando Hibernate, deve estar lendo um livro sobre o assunto ou então o próprio manual de referencia que vem com ele quando você baixa as bibliotecas.
No manual tem exemplo de como mapear os relacionamentos citados pelo drsmachado, na resposta acima. Da uma olhada lá. Eu mesmo uso o Hibernate desde 2009 quando comecei no Java, e sempre acabo tirando uma dúvida ou outra até hoje no manual de referencia do framework.

To querendo relacionamento OneToMany.

Coloquei assim na minha classe Funcionario, tem como darem uma olhada pra ver se ta certo ?

@Entity
@Table(name = "funcionario")
public class FuncionarioTO implements Serializable  {
    
    @Id
    @SequenceGenerator(name = "FUNCIONARIO GENERATION", sequenceName="id_funcionario_seq", allocationSize=1)
    @GeneratedValue(generator="FUNCIONARIO GENERATION", strategy = GenerationType.SEQUENCE)
    private Integer id;
    
    @Column(name="nome")
    private String nome;
    
    @Column(name="setor")
    private String setor;
    
    @Column(name="cargo")
    private String cargo;
    
    @Column(name="matricula")
    private Integer matricula;
    
    @OneToMany(cascade= CascadeType.ALL)
    @Fetch(FetchMode.JOIN)
    @JoinColumn(name="id_funcionario")
    private ColaboracaoTO colaboracao;

    public String getCargo() {
        return cargo;
    }

    public void setCargo(String cargo) {
        this.cargo = cargo;
    }

    public ColaboracaoTO getColaboracao() {
        return colaboracao;
    }

    public void setColaboracao(ColaboracaoTO colaboracao) {
        this.colaboracao = colaboracao;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Integer getMatricula() {
        return matricula;
    }

    public void setMatricula(Integer matricula) {
        this.matricula = matricula;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getSetor() {
        return setor;
    }

    public void setSetor(String setor) {
        this.setor = setor;
    }
    
}

Declarei OneToMany porque para 1 funcionario quero ter Varias colaboracoes. Declarei como cascade all para que o proprio hibernate faça a insercao dos dados da tabela colaboracao, a partir de funcionario.

O Fetch.JOIN é para ser através de JOINS.

O @JoinColumn(name=“id_funcionario”) é para dizer que id_funcionario é a chave estrangeira.

É mais ou menos isso mesmo ?

Um funcionário tem muitas colaborações? Então vai precisar trocar o atributo simples colaboracao por uma coleção destes (Collection, List ou Bag), caso contrário, haverá exceção.

Isso mesmo.

Pense assim, se um funcionario pode ter varias colaborações, você vai precisar armazenar essa colaborações em um objeto funcionario, então, vai precisar de uma coleção para armazenar em um funcionario, varias colaborações.

Agora na classe Colaboracao, cada colaboração pertence a um único usuário então terá que ter um atributo simples do tipo Funcionario.

De uma lida nos exemplos do Hibernate sobre mapeamentos: http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/

verdade, tentei executar aqui e deu exatamente esse erro.

Entao assim, nao quero criar colecoes, acho que me expressei errado, vou tentar desenhar mais ou menos como eu quero.

FUNCIONARIO
id nome
1 teste

2 testo

COLABORACAO
id_funcionario (chave estrangeira) valor
1 1,00
1 5,00
2 3,25

Acho que OneToOne serve certo ?

Se você tem um relacionamento 1-N, vai ter que trabalhar com coleções, é dessa forma que o Hibernate trabalha. Porque o tipo de mapeamento exige que seja uma coleção.

Ok, obrigado a todos. Entendi a parada =D

[quote=rof20004]Ok, obrigado a todos. Entendi a parada =D[/quote]Desculpe a demora em colocar, talvez esse post te ajude: JPA: Mini Livro - Primeiros passos e conceitos detalhados.

Eu estava querendo terminá-lo antes de colocar o link aqui! =D