Dúvidas de relacionamento JPA

4 respostas
F

Estou fazendo um projeto usando java5 e com jpa. Tenho as classes e os relacionamentos:

Nota: um cliente pode ter vários endereços.

Classe cliente

@Entity
public class Cliente {
	
	@Id
	@SequenceGenerator(name = "id", sequenceName = "SQ_CLIENTE")
	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "id")		
	private int id;
	private String nome;
	private String sobrenome;
	private String telefoneDDD;
	private String telefone;
	private String celularDDD;
	private String celular;
	private String comercialDDD;
	private String comercial;
	private String rg;
	private String cpf;
	private String cpt;
	private String cptSerie;
	
	@OneToMany
	private ArrayList<Endereco> endereco;
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}

Classe endereço:

@Entity
public class Endereco {

	@Id
	@SequenceGenerator(name = "id", sequenceName = "SQ_ENDERECO")
	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "id")		
	private int id;
	
	@ManyToOne(cascade=CascadeType.PERSIST)
	@JoinColumn(name="ID_CLIENTE")
	private Cliente cliente;
	private String endereco;
	private int numero;
	private String complemento;
	private String bairro;
	private String cidade;
	private String estado;
	private String pais;
	private String cep;

	public int getId() {
		return id;
	}

Tabela no bd:

CREATE TABLE ENDERECO
(
	ID		DECIMAL(7),
	ID_CLIENTE	DECIMAL(7),
	ENDERECO	VARCHAR(100),
	NUMERO		INT,
	COMPLEMENTO	VARCHAR(20),
	BAIRRO		VARCHAR(30),
	CIDADE		VARCHAR(50),
	ESTADO		CHAR(2),
	PAIS		VARCHAR(100),
	CEP		CHAR(9),

	CONSTRAINT PK_ENDERECO PRIMARY KEY(ID),
	CONSTRAINT FK_ENDERECO FOREIGN KEY(ID_CLIENTE) REFERENCES CLIENTE(ID)
)

O problema é que eu tenho que montar uma tela onde são cadastrados os clientes e outra separada para os endereços. Quando vou cadastrar o cliente ocorre um erro, pois eu não tenho o objeto endereço. Como eu resolvo isso com o relacionamento em duas telas separadas? Sendo que eu não posso ter uma pop-up na mesma tela.

4 Respostas

Jair_Rillo_Junior

Ola,

Algumas dicas:

  • Use a interface List<Endereco> ao invés da classe ArrayList<Endereco>.
  • Pelo que você descreveu, e se você gerou a tabela usando os objetos do JPA, eu acredito que ela tenha criado uma terceira tabela, chamada CLIENTE_ENDERECO, nao foi? Se seu relacionamento é unidirecional está correto, porém se você quer um relacionamento bidirecional coloque no @OneToMany a tag mappedBy=“endereco”. Isso vai dizer que a associação é bi-direcional (e uma terceira tabela não será criada).
  • Coloque a exceção do erro, porém eu acho que o erro está acontecendo porque você está mandando um valor NULL para o cliente.setEndereco()… ao invés disso, mande um ArrayList vazio… cliente.setEndereco(new ArrayList<Endereco>());

Espero ter ajudado

F

Bom dia Jair!

Em primeiro lugar agradeço sua atenção.
Eu não gerei as tabelas automaticamente via jpa, eu mapeie na mão mesmo para entender como faz. No banco de dados possuo somente duas tabelas CLIENTE e ENDERECO e não existe a tabela CLIENTE_ENDERECO.
Eu coloquei a tag mappedBy=“endereco” e funcionou, mas agora está aparecendo outro problema que acredito estar relacionado a quantidade de memória no servidor:

exception

javax.servlet.ServletException: Servlet execution threw an exception
	org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:154)
	org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:260)
	org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:366)
	org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:493)
	org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)

root cause

java.lang.OutOfMemoryError: PermGen space
	java.lang.Class.getDeclaredFields0(Native Method)
	java.lang.Class.privateGetDeclaredFields(Unknown Source)
	java.lang.Class.getDeclaredField(Unknown Source)
	java.io.ObjectStreamClass.getDeclaredSUID(Unknown Source)
	java.io.ObjectStreamClass.access$700(Unknown Source)
	java.io.ObjectStreamClass$2.run(Unknown Source)
	java.security.AccessController.doPrivileged(Native Method)
	java.io.ObjectStreamClass.<init>(Unknown Source)
	java.io.ObjectStreamClass.lookup(Unknown Source)
	java.io.ObjectStreamClass.initNonProxy(Unknown Source)
	java.io.ObjectInputStream.readNonProxyDesc(Unknown Source)
	java.io.ObjectInputStream.readClassDesc(Unknown Source)
	java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
	java.io.ObjectInputStream.readObject0(Unknown Source)
	java.io.ObjectInputStream.readArray(Unknown Source)
	java.io.ObjectInputStream.readObject0(Unknown Source)
	java.io.ObjectInputStream.readArray(Unknown Source)
	java.io.ObjectInputStream.readObject0(Unknown Source)
	java.io.ObjectInputStream.readArray(Unknown Source)
	java.io.ObjectInputStream.readObject0(Unknown Source)
	java.io.ObjectInputStream.readArray(Unknown Source)
	java.io.ObjectInputStream.readObject0(Unknown Source)
	java.io.ObjectInputStream.readArray(Unknown Source)
	java.io.ObjectInputStream.readObject0(Unknown Source)
	java.io.ObjectInputStream.readObject(Unknown Source)
	com.sun.faces.renderkit.ResponseStateManagerImpl.getTreeStructureToRestore(ResponseStateManagerImpl.java:196)
	org.ajax4jsf.application.AjaxStateManager.restoreView(AjaxStateManager.java:220)
	com.sun.faces.application.ViewHandlerImpl.restoreView(ViewHandlerImpl.java:301)
	org.ajax4jsf.application.ViewHandlerWrapper.restoreView(ViewHandlerWrapper.java:116)
	com.sun.facelets.FaceletViewHandler.restoreView(FaceletViewHandler.java:317)
	org.ajax4jsf.application.ViewHandlerWrapper.restoreView(ViewHandlerWrapper.java:116)
	com.sun.faces.lifecycle.RestoreViewPhase.execute(RestoreViewPhase.java:176)

Você sabe como resolver isso?
Estou usando o Eclipse (3.4), jboss (4.2) e o meu computador tem 2g de ram.

Jair_Rillo_Junior

Realmente é problema com relação a memória.
Dê uma pesquisada no google que existem várias páginas falando sobre isso :slight_smile:

bland

Verifique, também, se a sua aplicação não está executando nada cíclico.
Já passei por um problema desses e o meu erro foi não ter enxergado uma redundância cíclica na aplicação.
Fica a dica.

Abraço.

Criado 12 de fevereiro de 2009
Ultima resposta 12 de fev. de 2009
Respostas 4
Participantes 3