Problema com Relacionamentos @OnetoOne no MySQL

8 respostas
faeldix

Pessoal olhem minhas Entidades

package br.com.bean;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class Estado {
	
	@Id @GeneratedValue
	private Long id;
	private String nome;
	
	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	
	
	
}
package br.com.bean;

import java.util.Date;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.Lob;
import javax.persistence.OneToOne;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

@Entity
public class Usuario {

	@Id @GeneratedValue
	private Long id;
	private String email;
	@Temporal(TemporalType.DATE)
	private Date dataDeCadastro;
	@Lob
	private byte[] fotoPerfil;
	
	@OneToOne
	@JoinColumn(name="estado_id")
	private Estado estado;
	
	public Estado getEstado() {
		return estado;
	}
	public void setEstado(Estado estado) {
		this.estado = estado;
	}
	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public Date getDataDeCadastro() {
		return dataDeCadastro;
	}
	public void setDataDeCadastro(Date dataDeCadastro) {
		this.dataDeCadastro = dataDeCadastro;
	}
	public byte[] getFotoPerfil() {
		return fotoPerfil;
	}
	public void setFotoPerfil(byte[] fotoPerfil) {
		this.fotoPerfil = fotoPerfil;
	}
	
	
	
}

Main

package br.com.testes;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

import br.com.bean.Estado;
import br.com.bean.Usuario;

public class Testes {

	/**
	 * @param args
	 * @throws ParseException 
	 * @throws IOException 
	 */
	
	public static void main(String[] args) throws ParseException, IOException {
		
		EntityManagerFactory fac = Persistence.createEntityManagerFactory("MeuBanco");
		EntityManager manager = fac.createEntityManager();
		
		manager.getTransaction().begin();
		
		Usuario user = new Usuario();
		user.setDataDeCadastro(new SimpleDateFormat("dd/MM/yyyy").parse("12/09/1969"));
		user.setEmail("[email removido]");
		//FileInputStream stream = new FileInputStream(new File("src/META-INF/Untitled-1.png").getAbsolutePath());
		
		File f = new File("src/META-INF/Untitled-1.png");  
        FileInputStream fs = new FileInputStream(f.getAbsolutePath());  
        byte[] byt = new byte[(int)f.length()];  
        for(int i = 0;i < f.length();i++){  
            byt[i] = (byte) fs.read();  
        }
        
        user.setFotoPerfil(byt);
        Estado est = new Estado();
        est.setNome("Maranhão");
        
        user.setEstado(est);
        
        manager.persist(est);
        manager.persist(user);
        
        manager.getTransaction().commit();
        manager.close();
        fac.close();
		
	}

}

Funcionou certinho sooooooooooo que.. o relacionamento esta errado...

quando um relacionamento UM para UM é feito.. fica da seguinte forma

[img]http://img841.imageshack.us/img841/6269/meubanco2.png[/img]

so que quando eu faco a engenharia reversa do que foi feito nesse codigo ai em cima... olha como vem :(

[img]http://img51.imageshack.us/img51/7461/meubancox.png[/img]

Alguem tem ideia? To comecando a achar que e bug do MySQL Workbench

8 Respostas

oliversistemas

Quando vc grava um Usuario ele está gravando o Estado?

PS.: Não deveria ser um relacionamento diferente? Ex.: [Usuario] 0…* -------- 1 [Estado]

faeldix

oliversistemas:
Quando vc grava um Usuario ele está gravando o Estado?

PS.: Não deveria ser um relacionamento diferente? Ex.: [Usuario] 0…* -------- 1 [Estado]

cara pensando bem… deveseria ser um estado para varios usuarios… mas bem… vamos esquecer um pouco a “coesao” da coisa…
vamos no ater ao lance ai do relacioanmento :lol:

faeldix

Outra duvida.. se eu fizesse o seguinte:

package br.com.testes;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

import br.com.bean.Estado;
import br.com.bean.Usuario;

public class Testes {

	/**
	 * @param args
	 * @throws ParseException 
	 * @throws IOException 
	 */
	
	public static void main(String[] args) throws ParseException, IOException {
		
		EntityManagerFactory fac = Persistence.createEntityManagerFactory("MeuBanco");
		EntityManager manager = fac.createEntityManager();
		
		manager.getTransaction().begin();
		
		Usuario user = new Usuario();
		user.setDataDeCadastro(new SimpleDateFormat("dd/MM/yyyy").parse("12/09/1969"));
		user.setEmail("[email removido]");
		//FileInputStream stream = new FileInputStream(new File("src/META-INF/Untitled-1.png").getAbsolutePath());
		
		File f = new File("src/META-INF/Untitled-1.png");  
        FileInputStream fs = new FileInputStream(f.getAbsolutePath());  
        byte[] byt = new byte[(int)f.length()];  
        for(int i = 0;i < f.length();i++){  
            byt[i] = (byte) fs.read();  
        }
        
        user.setFotoPerfil(byt);
        Estado est = new Estado();
        est.setNome("Maranhão");
        
        user.setEstado(est);
        
        //manager.persist(est); <-- COMENTEI ESSA LINHA BEM AQUI
        manager.persist(user);
        
        manager.getTransaction().commit();
        manager.close();
        fac.close();
		
	}

}

NÃO DEVERIA FUNCIONA? Afinal atraves do endereco do getEstado de Usuario.. eu teria o endereco do Estado..

Hebert_Coelho

Não funciona pois você não colocou Cascade no seu relacionamento.

No primeiro caso, eu creio que a engenharia reversa gerou diferente pois quem criou tudo não foi o JPA. Ou foi? Não sei como vc fez.

faeldix

jakefrog:
Não funciona pois você não colocou Cascade no seu relacionamento.

No primeiro caso, eu creio que a engenharia reversa gerou diferente pois quem criou tudo não foi o JPA. Ou foi? Não sei como vc fez.

sim foi. mas isso tem alguma coisa a ver?

Hebert_Coelho

Pelo visto sim. [=

Pra q vc ta querendo usar a Eng. Rev.?

faeldix

Pelo visto sim. [=

Pra q vc ta querendo usar a Eng. Rev.?

eu fiz apenas pra ter certeza que esta funcionando direitinho… pois to aprendendo ainda trabalhar com JPA.
mas pelo jeito ta td certo ne?

__

Se eu quisesse trabalhar com cascade ai… como eu faria?
Nao entendi direito.

Hebert_Coelho

Parece que sim. [=

Criado 1 de fevereiro de 2012
Ultima resposta 1 de fev. de 2012
Respostas 8
Participantes 3