Relacionamentos em JPA

Boa tarde a todos,

Sou novo em Java e acabei de ficar responsável por mapear as entidades de uma aplicação que temos, porém ela foi concebida usando o paradigma relacional, de modo que a interpretação dos relacionamentos, fazendo a relação "relacional x objeto" é muito confusa para mim, alguém pode me dar uma ajuda?? Para estas tabelas os relacionamentos são todos do tipo OneToOne.

Vou reduzir a quantidade de atributos para ficar mais simples e direto, é o seguinte:

Tabela Usuario:
. login (String) (pk)
. idEmpresa (int)
. idFilial (int)
. idColaborador (int)
. idCliente (int)
. idEstabelecimento (int)
. idContato
. senha (String)

Tabela Colaborador:
. idEmpresa (int) (pk)
. idFilial (int) (pk)
. idColaborador (int) (pk)
. nome (String)

Tabela Contato:
. idCliente (int) (pk)
. idEstabelecimento (int) (pk)
. idContato (pk)
. nome (String)

Tabela SecUser
. login (String) (pk) —> tem relação com os campos "login" das tabelas Usuario e SecGroup
. description (String) —> tem relação com o campo "nome" das tabelas Contato e Colaborador

Tabel SecGroup
. login (String) (pk)
. group (String) (pk)

A regra é a seguinte:

Usuario depende de SecGroups que depende de SecUsers que depende de (Colaborador/Contato)

Fiz vários ensaios, usando dicas do site do Hebert sobre relacionamentos (JPA Consultas e Dicas, Mini Livro JPA - muito importantes para mim), e em outros sites, mas não achei nada parecido com isso.

Alguém se habilita??

Marcos Motta.

seria legal você colocar o que vc tentou fazer até agora, vai ficar mais fácil pro pessoal te ajudar

posta suas classes ai

Pessoal, estou postando as classes que criei, elas não estão com os relacionamentos porque de tanto testar possibilidades sem sucesso acabei por não saber por onde começar, não sei se o problema é que estou pensando fora de OO, mas sempre vejo o resultado como errado, além de não ter conseguido gerá-los quando em uma tabela existem 2 chaves primárias e na outra apenas uma, como é o caso do relacionamento entre security_users e security_groupings. Sei que o post ficou grande mas achei que seria melhor se colocado desta forma.

Agradeço desde já pela ajuda.

Classe Usuario:

package com.model;

import java.util.Calendar;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;

@Entity
@Table(name="usuario")
@NamedQueries({
	@NamedQuery(name="Usuario.findAllUsuarios", query="select u from Usuario u"),
	@NamedQuery(name="Usuario.findUsarioByLogin", query="select u from Usuario u where u.idLogin = :idLogin")
})
public class Usuario {
	
	public static final String FIND_ALL_USERS = "Usuario.findAllUsuarios";
	public static final String FIND_USER_BY_LOGIN = "Usuario.findUsuariorByLogin";
	
	@Id
	@Column(name="id_login", unique=true)
	private String idLogin;
	
	@Column(name="id_empre")
	private int idEmpresa;
	@Column(name="id_filia")
	private int idFilial;
	@Column(name="id_colab")
	private int idColaborador;
	@Column(name="id_clifo")
	private int idCliente;
	@Column(name="id_estab")
	private int idEstabelecimento;
	@Column(name="id_ctato")
	private int idContato;
	@Column(name="cd_senha")
	private String cdSenha;
	@Column(name="dt_cadas")
	private Calendar dtCadastro;
	@Column(name="vl_suppl_house")
	private double vlSupplyHouse;
	@Column(name="st_usuar_web")
	private String stUsuarioWeb;
	@Column(name="dt_alter_senha")
	private Calendar dtAlteracaoSenha;
	@Column(name="st_alter_senha")
	private String stAlteracaoSenha;
	@Column(name="st_logad")
	private String stLogado;
	@Column(name="qt_logins")
	private int qtLogins;
	@Column(name="st_visua_gesto")
	private String stVisualizacaoGestor;
	@Column(name="tp_visua_gesto_ext")
	private String tpVisualizacaoGestorExterno;
	@Column(name="qt_restr")
	private int qtRestricoes;
	
	// Getters and Setters

	@Override
	public int hashCode(){
		return idLogin.hashCode();
	}

	@Override
	public boolean equals(Object obj) {
		if (obj instanceof Usuario) {
			Usuario usuario = (Usuario) obj;
			return usuario.getIdLogin().equals(getIdLogin());
		}
		return false;
	}
}

Classe Security_Users:

package com.model;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;

@Entity
@Table(name="security_users")
@NamedQueries({
	@NamedQuery(name="Security_Users.findAllSecUsers", query="select s from Security_Users s"),
	@NamedQuery(name="Security_Users.findUserByDescription", query="select s from Security_Users s where s.description = :description"),
	@NamedQuery(name="Security_Users.findDescriptionByUser", query="select s from Security_Users s where s.name = :name")
	})
public class Security_Users {

	public static final String FIND_ALL_SEC_USERS = "Security_Users.findAllSecUsers";
	public static final String FIND_USER_BY_DESCRIPTION = "Security_Users.findUserByDescription";
	public static final String FIND_DESCRIPTION_BY_USER = "Security_Users.findDescriptionByUser";
	
	@Id
	@Column(unique=true)
	private String name;
	
	private String description;
	private int priority;
	
	@Column(name="user_type")
	private int userType;
	
	// Getters and Setters
	
	public int hashCode(){
		return name.hashCode();
	}
	
	public boolean equals(Object obj) {
		if (obj instanceof Security_Users) {
			Security_Users su = (Security_Users) obj;
			return su.getName().equals(getName());
		}
		return false;
	}
}

Classe Security_Groupings:

package com.model;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.IdClass;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;

@Entity
@Table(name="security_groupings")
@NamedQueries({
	@NamedQuery(name="Security_Groupings.findAllSecGroupings", query="select s from Security_Groupings s"),
	@NamedQuery(name="Security_Groupings.findGroupByLogin", query="select s from Security_Groupings s where s.userName = :userName"),
	@NamedQuery(name="Security_Groupings.findLoginByGroup", query="select s from Security_Groupings s where s.groupName = :groupName")
})
@IdClass(Security_GroupingsID.class)
public class Security_Groupings {
	
	public static final String FIND_ALL_SEC_GROUPINGS = "Security_Groupings.findAllSecGroupings";
	public static final String FIND_GROUP_BY_LOGIN = "Security_Groupings.findGroupByLogin";
	public static final String FIND_LOGIN_BY_GROUP = "Security_Groupings.findLoginByGroup";
	
	@Id
	@Column(name="group_name")
	private String groupName;
	
	@Id
	@Column(name="user_name")
	private String userName;
	
        // Getters and Setters

}

Classe Security_GroupingsId:

package com.model;

import java.io.Serializable;

public class Security_GroupingsID implements Serializable{
	
	private static final long serialVersionUID = 343L;
	
	private String groupName;
	private String userName;
	
	public Security_GroupingsID(){	}
	
	public Security_GroupingsID(String groupName, String userName) {
		this.groupName = groupName;
		this.userName = userName;
	}

	public String getGroupName() {
		return groupName;
	}

	public String getUserName() {
		return userName;
	}
	
	@Override
	public int hashCode(){
		return groupName.hashCode() + userName.hashCode();
	}
	
	@Override
	public boolean equals(Object obj){
		if (obj instanceof Security_GroupingsID) {
			Security_GroupingsID secGroupsID = (Security_GroupingsID) obj;
			return secGroupsID.groupName.equals(this.groupName) && secGroupsID.userName.equals(this.userName);
		}
		return false;
	}
}

Classe Colaborador:

package com.model;

import java.util.Calendar;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.IdClass;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;

@Entity
@Table(name="colaborador")
@NamedQueries({
	@NamedQuery(name="Colaborador.findAllColaboradores", query="select c from Colaborador c"),
	@NamedQuery(name="Colaborador.findColaboradorByEmpresa", query="select c from Colaborador c where c.idEmpresa = :idEmpresa"),
	@NamedQuery(name="Colaborador.findColaboradorByEmpresaFilial", query="select c from Colaborador c where c.idEmpresa = :idEmpresa and c.idFilial = :idFilial"),
	@NamedQuery(name="Colaborador.findColaboradorByEmpresaFilialColaborador", query="select c from Colaborador c where c.idEmpresa = :idEmpresa and c.idFilial = :idFilial and c.idColaborador = :idColaborador")
})
@IdClass(ColaboradorId.class)
public class Colaborador {
	
	private static final String FIND_ALL_COLABORADORES = "Colaborador.findAllColaboradores";
	private static final String FIND_COLABORADOR_BY_EMPRESA = "Colaborador.findColaboradorByEmpresa";
	private static final String FIND_COLABORADOR_BY_EMPRESA_FILIAL = "Colaborador.findColaboradorByEmpresaFilial";
	private static final String FIND_COLABORADOR_BY_EMPRESA_FILIAL_COLABORADOR = "Colaborador.findColaboradorByEmpresaFilialColaborador";
	
	@Id
	@Column(name="id_empre")
	private int idEmpresa;
	@Id
	@Column(name="id_filia")
	private int idFilial;
	@Id
	@Column(name="id_colab")
	private int idColaborador;
	@Column(name="id_nivel_organ")
	private String idNivelOrganico;
	@Column(name="id_cargo")
	private int idCargo;
	@Column(name="nm_colab")
	private String nmColaborador;
	@Column(name="st_vincu")
	private String stVinculacao;
	@Column(name="de_ender")
	private String deEndereco;
	@Column(name="de_bairr")
	private String deBairro;
	@Column(name="de_cidad")
	private String deCidade;
	@Column(name="id_regis_estad")
	private String idRegisEstado;
	@Column(name="nu_cep_colab")
	private int nuCEPColaborador;
	@Column(name="nu_ramal_1")
	private int nuRamal1;
	@Column(name="nu_ramal_2")
	private int nuRamal2;
	@Column(name="dt_admis")
	private Calendar dtAdmissao;
	@Column(name="dt_demis")
	private Calendar dtDemissao;
	@Column(name="vl_remun_contr")
	private double vlRemuneracaoContratual;
	@Column(name="id_regis_unida_contr")
	private String idRegisUnidadeContratual;
	@Column(name="nu_telef1")
	private int nuTelefone1;
	@Column(name="nu_telef2")
	private int nuTelefone2;
	@Column(name="de_mail_1")
	private String deMail1;
	@Column(name="de_mail_2")
	private String deMail2;
	@Column(name="nu_ddd")
	private int nuDDD;
	@Column(name="st_usuar_ad")
	private String stUsuarioAD;

	// Getters and Setters

	}
}

Classe ColaboradorId:

package com.model;

import java.io.Serializable;

public class ColaboradorId implements Serializable{
	
	private static final long serialVersionUID = 142L;

	private int idEmpresa;
	private int idFilial;
	private int idColaborador;
	
	public ColaboradorId() { }
	
	public ColaboradorId(int idEmpresa, int idFilial, int idColaborador){
		this.idEmpresa = idEmpresa;
		this.idFilial = idFilial;
		this.idColaborador = idColaborador;
	}

	public int getIdEmpresa() {
		return idEmpresa;
	}

	public int getIdFilial() {
		return idFilial;
	}

	public int getIdColaborador() {
		return idColaborador;
	}
	
	public int hashCode(){
		return idEmpresa + idFilial + idColaborador;
	}
	
	public boolean equals(Object obj){
		if (obj instanceof ColaboradorId) {
			ColaboradorId colaboradorID = (ColaboradorId) obj;
			return colaboradorID.idEmpresa == this.idEmpresa && colaboradorID.idFilial == this.idFilial && colaboradorID.idColaborador == this.idColaborador; 
		}
		return false;
	}
}

Classe Contato_Cliente_Fornecedor:

package com.model;

import java.util.Calendar;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.IdClass;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;

@Entity
@Table(name="contato_cliente_fornecedor")
@NamedQueries({
	@NamedQuery(name="Contato_Cliente_Fornecedor.findAllContatos", query="select c from Contato_Cliente_Fornecedor c"),
	@NamedQuery(name="Contato_Cliente_Fornecedor.findContatoByCliente", query="select c from Contato_Cliente_Fornecedor c where c.idCliente = :idCliente"),
	@NamedQuery(name="Contato_Cliente_Fornecedor.findContatoByClienteEstab", query="select c from Contato_Cliente_Fornecedor c where c.idCliente = :idCliente and c.idEstabelecimento = :idEstabelecimento"),
	@NamedQuery(name="Contato_Cliente_Fornecedor.findContatoByClienteEstabContato", query="select c from Contato_Cliente_Fornecedor c where c.idCliente = :idCliente and c.idEstabelecimento = :idEstabelecimento and c.idContato = :idContato")
})
@IdClass(Contato_Cliente_FornecedorId.class)
public class Contato_Cliente_Fornecedor {

	private static final String FIND_ALL_CONTATOS = "Contato_Cliente_Fornecedor.findAllContatos";
	private static final String FIND_CONTATO_BY_CLIENTE = "Contato_Cliente_Fornecedor.findContatoByCliente";
	private static final String FIND_CONTATO_BY_CLIENTE_ESTAB = "Contato_Cliente_Fornecedor.findContatoByClienteEstab";
	private static final String FIND_CONTATO_BY_CLIENTE_ESTAB_CONTATO = "Contato_Cliente_Fornecedor.findContatoByClienteEstabContato";

	@Id
	@Column(name="id_clifo")
	private int idCliente;
	@Id
	@Column(name="id_estab")
	private int idEstabelecimento;
	@Id
	@Column(name="id_ctato")
	private int idContato;
	@Column(name="nm_ctato")
	private String nmContato;
	@Column(name="de_trata")
	private String deTratamento;
	@Column(name="dt_nasci")
	private int dtNascimento;
	@Column(name="st_emiss_corre")
	private String stEmissaoCorrespondencia;
	@Column(name="de_mail1")
	private String deMail1;
	@Column(name="de_mail2")
	private String deMail2;
	@Column(name="id_regis_cargo")
	private String idRegisCargo;
	@Column(name="id_regis_area_compe")
	private String idRegisAreaCompetencia; 
	@Column(name="dt_desli")
	private Calendar dtDesligamento;
	@Column(name="vl_remun_contr")
	private double vlRemuneracaoContratual;
	@Column(name="id_regis_unida_contr")
	private String idRegisUnidadeContratual;

	// Getters and Setters

	}
}

Classe Contato_Cliente_FornecedorId

package com.model;

import java.io.Serializable;

public class Contato_Cliente_FornecedorId implements Serializable{

	private static final long serialVersionUID = 152L;
	
	private int idCliente;
	private int idEstabelecimento;
	private int idContato;

	public Contato_Cliente_FornecedorId() {
	}

	public Contato_Cliente_FornecedorId(int idCliente, int idEstabelecimento, int idContato) {
		this.idCliente = idCliente;
		this.idEstabelecimento = idEstabelecimento;
		this.idContato = idContato;
	}
	
	public int getIdCliente() {
		return idCliente;
	}
	public int getIdEstabelecimento() {
		return idEstabelecimento;
	}
	public int getIdContato() {
		return idContato;
	}
	
	public int hashCode(){
		return idCliente + idEstabelecimento + idContato;
	}
	
	public boolean equals(Object obj) {
		if (obj instanceof Contato_Cliente_FornecedorId) {
			Contato_Cliente_FornecedorId contatoID = (Contato_Cliente_FornecedorId) obj;
			return contatoID.idCliente == this.idCliente && contatoID.idEstabelecimento == this.idEstabelecimento && contatoID.idContato == this.idContato;
		}
		return false;
	}
}

Grato pela ajuda.

eu vi que vc que a coluna id_empre em varias tabelas, existe uma tabela empresa

Sim, existe uma tabela empresa e uma filial, ambas precedem a tabela de colaborador e uma tabela cliente_fornecedor e estab_cliente_fornecedor que precedem contato_cliente_fornecedor, achei que não seria necessário enviá-las.

Existem aplicativos que agilizam isto pra voce. MySQL Workbench é uma otima ferramenta para isso, ela te ajuda a criar os diagramas do seu banco e ainda de quebra gera o SQL pra voce, que posteriormente, com o Hibernate Tools, voce geraria suas classes todas mapeadas a partir do banco.

Isso nao é muito usado, mas é so uma dica.

Acho que voce poderia criar um diagrama com o MySQL Workbench e postar aqui pra gente dar uma olhada. Pelo menos pra mim fica mais entendivel =D.

Flw!

não sou muito experiente, mas acredito que ja que vc vai usar jpa vc deve criar um classe para todas as suas entidades.

acredito que uma forma ideal é começar mapeando as tabelas com menor dependências (aquelas que não possuem chaves estrangeiras )

[quote=rof20004]Existem aplicativos que agilizam isto pra voce. MySQL Workbench é uma otima ferramenta para isso, ela te ajuda a criar os diagramas do seu banco e ainda de quebra gera o SQL pra voce, que posteriormente, com o Hibernate Tools, voce geraria suas classes todas mapeadas a partir do banco.

Isso nao é muito usado, mas é so uma dica.

Acho que voce poderia criar um diagrama com o MySQL Workbench e postar aqui pra gente dar uma olhada. Pelo menos pra mim fica mais entendivel =D.

Flw![/quote]

isso também é uma solução, mas se a intenção é aprender isso não vai ajudar muito, hibernate tools vai gerar todas as classes mapeadas ele não vai saber porque ele mapeou de tal forma, e quando surgir um problema ele não vai saber esta acontecendo

Uhum, por isso cabe a ele decidir o que será viável.

Com relação a criar as classes com menos dependências, já estou fazendo isso, mas o sistema tem muitas tabelas usando relacionamentos com 1, 2, 3 e até 4 PKs na mesma tabela, isso fora as FKs, e vou acabar chegando nelas, porque as mais simples são pequenas tabelas de apoio.

Com relação ao MySQL Workbench, ele conecta no SQL Server ou no Oracle ? Olhei rápido por aqui mas não vi ninguém relatando sucesso.

Abraço.

Acredito que so no MySQL.

A questao é que voce pode usar este programa so para gerar o Diagrama, eu so uso pra isso, os mapeamentos e tudo mais faço na mão mesmo.

Porque geralmente eu gosto de apresentar meu modelo de banco com diagramas, fica muito mais facil de as pessoas entenderem.

Danilo, concordo com você, realmente preciso saber como fazer isso, o uso da ferramente como facilitador é uma coisa que eu até poderia utilizar, mas saber o porque é fundamental.

rof20004, obrigado pela dica, realmente posso utilizar no futuro, mas vou ter que repassar esse conhecimento e vai ficar difícil se eu não souber os porquês.

Valeu.