[Resolvido] - Hibernate Anotações

[color=blue]Olá pessoal do Guj.

Sou novo aqui e estou estudando atualmente o Hibernate. Eu comecei a ler uma apostila sobre Hibernate Annotations e estou atualmente com muitas dúvidas em algumas anotações. Acho interessante algumas perguntas que quero fazer pois elas exigem atenção dos programadores iniciantes em Hibernate assim como eu (e infelizmente não tô tendo talvez).

Ah, eu sei que é meio folga minha chegar já perguntando um montão de coisa. Mas este é um fórum que contém uma sessão sobre isso, certo? Mas desculpem mesmo assim. :oops:

1 - Com relação a anotação [color=red]@JoinTable[/color] o que ela especificamente faz? Eu li que ela só é usada em relacionamentos/associações de tabelas, e também quando você deseja ter uma tabela intermediária entre duas tabelas, só que, não tendo essa “tabela do meio” como uma classe declarada. Mas ao utilizar essa anotação em uma variável de instância, o que eu quero dizer para aquela variável com esta anotação? Se puderem dar uma exemplo bem esclarecedor, puxa, eu vou adorar. Tenho quebrado a cabeça mesmo tentando entender isso.

2 - Também tenho dúvidas com anotações de relação. Tipo [color=red]@OneToMany[/color] e [color=red]@ManyToOne[/color]. Como eu sei qual a outra tabela que eu estou tentando me relacionar?

Exemplo: Temos uma classe Aluno com relacionamento 1 para N de Telefone. Então, na classe Aluno, temos:


	// mappedBy referencia a variável de instância
	// Aluno na classe Telefone
	@OneToMany(mappedBy = "aluno" , fetch = FetchType.LAZY)
	@Cascade(CascadeType.SAVE_UPDATE)
	private Collection <Telefone>telefone; // É aqui que vemos a tabela de relacionamento? Através do tipo da variável?

O Hibernate reconhece como isso? Através da outra classe que é declarada como entidade ([color=red]@Entity[/color])?

3 - Tá, essa dúvida pra mim é a mais chata. Encontrei pouco disso na internet. Geralmente o que eu encontrei, foram dúvidas de outras pessoas e que mal falaram sobre isso: [color=red]@CollectionOfElements[/color]

Como posso utilizar ela? O que eu quero dizer com essa anotação em uma variável?

Aqui tem a apostila que estou lendo caso vocês queiram dar uma olhada. Eu sinceramente achei ela MUITO :x resumida a ponto de um novato que nem eu não entender nada.

Link para download: http://www.mediafire.com/?84exgyhw6sy9noc ([color=green]105 páginas, com índice[/color])

Desde já acradeço a atenção de todos aqui no fórum por prestarem socorro para nós que estamos em dúvidas. Obrigado! :-o

[color=orange]Editado e resolvido a ultima vez em 30 de julho de 2010.[/color]

Olá litium, bem vindo ao GUJ! :smiley:

1 - @JoinTable serve para criar uma tabela associativa entre duas tabelas com relacionamento um-para-muitos ou muitos-para-muitos. Quando a associação é muitos-para-muitos a tabela é criada pelo Hibernate, então você pode utilizar a anotação para controlar nome da tabela, das colunas, etc. Eu não costumo usar quando o relacionamento é um-para-muitos. Vamos dizer que um Funcionario pode trabalhar em vários Departamentos, e que um Departamento possui muito Funcionarios:

[code]@Entity
public class Funcionario {

@ManyToMany(mappedBy = "funcionarios")
private List<Departamento> departamentos;

}

@Entity
public class Departamento {

@ManyToMany
@JoinTable(name = "TBL_DEP_FUNC", // nome da tabela associativa
	joinColumns = @JoinColumn(name = "PK_DEP"), // pk da tabela dessa entidade usada para relacionamento
	inverseJoinColumns = @JoinColumn(name = "PK_FUNC")) // pk da tabela da entidade relacionada, usada para relacionamento
private List<Funcionario> funcionarios;

}[/code] Se você não usar @JoinTable, no @ManyToMany o Hibernate cria a tabela pra você do mesmo jeito!

2 - Um Aluno possui muitos Telefones, então a classe fica assim:

@Entity class Aluno { @OneToMany private Collection <Telefone>telefone; }Você não precisa se preocupar com qual tabela está se relacionando, a sua preocupação deve ser somente entre os objetos. Só esse código é o suficiente para que o Hibernate saiba como fazer a relação, desde que a outra classe esteja anotada como Entity também.

3 - @CollectionOfElement corresponde à @OneToMany, só que essa anotação é só do Hibernate. Prefira utilizar @OneToMany.

Nesse link você encontra tudo (ou quase) que precisa saber das anotações do Hibernate.

E pra finalizar, vou te parabenizar pelo tópico. Se todo mundo que tá começando escrevesse bem assim, com dúvidas claras, usando as tags e demais recursos do fórum, a motivação para respondê-los seria bem maior.

Flw! :thumbup:

Opa!

Valeu aí pelo “bem vindo e tal”!!! 8) hehehehe… Caramba fiquei meio sem jeito agora. Você falando desse jeito dá até vontade de perguntar mais!! kkkkkkkkkkkkk!! :lol:

E eu vou! Você falou:

Eu poderia fazer uma associação [color=red]@OneToMany[/color] e [color=red]@ManyToMany[/color] manualmente e funcional mesmo sem a anotação [color=red]@JoinTable[/color]? Tipo, criar uma tabela intermadiária entre (por exemplo) Departamento e Curso (relacionamento ManyToMany)?

Se sim, devo concluir que essa anotação tá aí só de enfeite? Ou, opcional…?? :?

Minha dúvida é só mais essa mesmo. Entendi o @CollectionOfElements e também o que você falou de me preocupar só com relacionamento de objetos que o Hibernate toma conta disso. Bem como eu suspeitei, o Hibernate reconhece quando coloca-se a outra classe como Entidade ([color=red]@Entity[/color]). Pode apostar que quando eu tiver alguma dúvida, vou procurar primeiro no link que você me recomendou! Se não adiantar eu procuro na net de novo, mesmo não encontrando quase nada. E se ainda assim não adiantar, me aguardem, eu regressarei! mauahahahahaha!!! :twisted: kkkkkkk! :lol:

Abraços von.juliano e obrigado pela ajuda! Continue assim tão prestativo que nós reconheceremos a sua parte!

Você pode fazer manualmente, pode criar uma entidade DepartamentoCurso que contém uma lista de Departamentos e outra de Cursos. A utilidade disso será se você quiser adicionar mais campos nessa tabela. Se for só pra relacionar, use no máximo @JoinTable

Não é que a anotação está aí só de enfeite, se você fizer uma relação ManyToMany, o Hibernate já cria a tabela associativa sim, mas com a @JoinTable você pode dizer pra ele o nome da tabela, colunas nas relações, essas coisas.

Opa, pode perguntar! Estamos aqui pra ajudar, mas o que falei sobre o seu tópico é sério, o pessoal pede ajuda e muitas vezes não se preocupam em escrever bem a pergunta. É como falam no Tropa de elite, pra te ajudar, primeiro você precisa me ajudar a te ajudar! :lol:

Flw! Bons estudos, e qualquer coisa tamos ae! :mrgreen:

E aí!

Então von.juliano, obrigado mais uma vez por esclarecer minha dúvida. Realmente, preciso te ajudar para você me ajudar (a ajudar você, para me ajudar, pra depois te ajudar… OPA! Loop infinito aqui! kkkkkkkkkk! :lol: Credo, tô estudando demais! Vou ver se descanço por hoje e retorno ao estudos amanhã de manhãzinha)

Mas falando sério agora: Tudo ficou claro para mim. Só estou respondendo para mostrar que o tópico foi resolvido e que o pessoal da moderação pode fechar o tópico e, se quiser, colocar “Resolvido” no lugar de “Dúvida” (Ou sou eu que tenho que fazer isso? Eu tenho como fazer isso? :? Eu num tenho muita experiência em fórums!!!).

Obrigado pela ajuda novamente! Abraços!

O pessoal não fecha não :smiley: , e quem coloca o “RESOLVIDO” no título é você mesmo, é só editar o seu primeiro post e adicionar!

Abraço!
Juliano

Bom dia!
Sou novo no fórum e estou solicitando ajuda na minha dúvida quanto o @CollectionOfElements abaixo.
E me desculpem se estiver perguntando no lugar errado.

@Entity
@Table(name=“BO”)
public class BO implements Serializable {
@Id
@SequenceGenerator(name=“generator_bo”,sequenceName=“sequence_bo”)
@GeneratedValue(generator=“generator_bo” )
@Column(name=“cod”)
private int cod;

@CollectionOfElements
@JoinTable(name="GcmEnv", joinColumns=@JoinColumn(name="idGcmEnv"))
@Column(name="nomeGcm")
private Set<String> gcmenv;

…getters e setters
}

teria como adicionar outras colunas na criação da tabela GcmEnv, como por exemplo, data de nascimento, endereço e outros?

Tentei fazer assim e não deu certo ou seja o hibernate não aceita

@Entity
@Table(name=“BO”)
public class BO implements Serializable {
@Id
@SequenceGenerator(name=“generator_bo”,sequenceName=“sequence_bo”)
@GeneratedValue(generator=“generator_bo” )
@Column(name=“cod”)
private int cod;

@CollectionOfElements
@JoinTable(name="GcmEnv", joinColumns=@JoinColumn(name="idGcmEnv"))
@Column(name="nomeGcm")

@Column(name=“data_nasc”)

@Column(name=“endereco”)

private Set<String> gcmenv;

…getters e setters
}

Atenciosamente: Jorge