Várias Dúvidas básicas @OneToOne e @ManyToOne

3 respostas
D

Bom dia,

estou aprendendo a mexer no Hibernate, estou apanhando e muito com a parte de relacionamentos, eu fiz um exemplo mas ele não funciona nem com reza, gostaria de tirar várias dúvidas.

No caso eu crie uma aplicação que use o relacionamento @OneToOne como por exemplo um Banco e uma Agencia (sei que seria @OneToMany), mas é só pra testar mesmo.
Faz uma classe Banco e outra Agencia

@Entity @Table(name = "dbo.Banco") public class Banco { @Id private int numeroBanco; private String nomeBanco; @OneToOne() Agencia agencia;

@Entity @Table(name = "dbo.Agencia") public class Agencia { @Id private int numeroAgencia; private String cidade; private String estado; @OneToOne() private Banco banco;

Ficaria assim mesmo?

Como que ficaria os contrutores? Ficaria assim?

public Banco(int numeroBanco, String nomeBanco, Agencia agencia) { this.numeroBanco = numeroBanco; this.nomeBanco = nomeBanco; this.agencia = agencia; }

public Agencia(int numeroAgencia, String cidade, String estado, Banco banco) { this.numeroAgencia = numeroAgencia; this.cidade = cidade; this.estado = estado; this.banco = banco; }

No Banco de Dados, como que ficaria?

3 Respostas

A

Em partes encontra-se correto o relacionamento. O que acredito que ficou faltando foi a questão de definir quem eh o dono do relacionamento, que neste caso deve ser mapeado pelo atributo da annotation mappedBy no lado mais fraco do relacionamento. Por fim, as entidades deve possuir pelo menos um construtor default. Outros construtores podem vir declarados depois dos mesmos. Opcionalmente você poderia definir qual seria a colina da fk que você esta mapeando a entidade. Isso poderia ser feito pela annotation @joinColumn na entidade mais forte.

Por hora, seria somente isso. Se isso não funcionar, posta pra gente a stack trace.

Abraços

D
package Modelo;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.Table;

@Entity
@Table(name = "dbo.Banco")
public class Banco {
	@Id
	private int numeroBanco;
	private String nomeBanco;
	@OneToOne()
	@JoinColumn(name="numeroAgencia")
	Agencia agencia;
	
	public Banco(){
		
	}

	public Banco(int numeroBanco, String nomeBanco, Agencia agencia) {
		this.numeroBanco = numeroBanco;
		this.nomeBanco = nomeBanco;
		this.agencia = agencia;
	}
package Modelo;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.MapKey;
import javax.persistence.OneToOne;
import javax.persistence.Table;

@Entity
@Table(name = "dbo.Agencia")
public class Agencia {
	@Id
	private int numeroAgencia;
	private String cidade;
	private String estado;
	@OneToOne(mappedBy="banco")
    private Banco banco;
	
	public Agencia(){
		
	}

	public Agencia(int numeroAgencia, String cidade, String estado, Banco banco) {
		this.numeroAgencia = numeroAgencia;
		this.cidade = cidade;
		this.estado = estado;
		this.banco = banco;
	}

Exception in thread "main" java.lang.ExceptionInInitializerError
at Visao.Main.main(Main.java:15)
Caused by: org.hibernate.AnnotationException: @OneToOne or @ManyToOne on Modelo.Banco.agencia references an unknown entity: Modelo.Agencia
at org.hibernate.cfg.ToOneFkSecondPass.doSecondPass(ToOneFkSecondPass.java:81)
at org.hibernate.cfg.AnnotationConfiguration.processEndOfQueue(AnnotationConfiguration.java:456)
at org.hibernate.cfg.AnnotationConfiguration.processFkSecondPassInOrder(AnnotationConfiguration.java:438)
at org.hibernate.cfg.AnnotationConfiguration.secondPassCompile(AnnotationConfiguration.java:309)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1286)
at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:867)
at Hibernate.HibernateBanco.(HibernateBanco.java:14)
... 1 more

O que poderia estar errado?

A

ok. Neste caso, voce devera declarar dentro do seu persistence.xml as classes que sao persistentes no negocio.

Exemplo de declaracao dentro do persistence.xml:
Modelo.Banco
Modelo.Agencia

Este tipo de problema ja percebi ocorrer quando o projeto nao eh JAVA EE completo. Por exemplo, de repente voce poderia estar criando um projeto web comum, com JPA ativado no mesmo. Em projetos EAR (EJB + WAR) essas declaracoes passam a ser opcionais, pois ele varre no classpath as classes anotadas com @Entity.

De qualquer forma, uma vez declarada as tags , qualquer outra classe criada dentro do projeto, se o mesmo nao for declarada, sera assumido que a classe recem criada nao faz parte do modelo de negocio/persistencia.

Por fim, nao pude ver no codigo, mas acredito que os setters e getters voce os declarou, correto?

Criado 25 de abril de 2010
Ultima resposta 25 de abr. de 2010
Respostas 3
Participantes 2