EJB3 - Herança

4 respostas
F

Pessoal estou tentando implementar herança da seguinte forma:

Tabelas

Pessoa (pk= id_pessoa)
PessoaFisica(pk = id_pessoa_fisica, fk=id_pessoa)

Existe alguma forma de implementar isso ? Como ficariam as anotações das classe e das chaves primarias ?

OBS: Eu não gostaria que a chave primaria da tabela pessoa_fisica fosse composta pela chave primaria da tabela pessoa

Valeu

4 Respostas

ronnypeterson

Na realidade não veja pq vc está criando uma novo id em pessoa_fisica, basta vc aproveitar o id de pessoa e pronto.

Segue um exemplo de como vc pode implementar herança:

No banco de dados tabela Pessoa:

CREATE TABLE PESSOA
(
   ID SERIAL NOT NULL,   
   NOME VARCHAR(150) NOT NULL,   
   CONSTRAINT PESSOA_PKEY PRIMARY KEY (ID)   
);

No banco tabela Pessoa_Fisica:

CREATE TABLE PESSOA_FISICA
(      
   ID INTEGER NOT NULL,  
   DATA_NASC DATE NOT NULL,
   ESTADO_CIVIL VARCHAR(20) NOT NULL,
   SEXO CHAR(1), --(M)MASCULINO (F)FEMENINO
   TIPO_SANGUE VARCHAR(8),
   FATOR_RH CHAR(1), --(+)POSITIVO (-)NEGATIVO
   NACIONALIDADE VARCHAR(20),  
   NATURALIDADE VARCHAR(20),  
   ESCOLARIDADE VARCHAR(30),
   PROFISSAO VARCHAR(50),  
   OBSERVACAO VARCHAR(100),
   CONSTRAINT PESSOAFISICA_PKEY PRIMARY KEY (ID),
   CONSTRAINT PESSOAFISICA_PESSOA_FKEY FOREIGN KEY (ID) REFERENCES PESSOA   
);

Classe pessoa:

@Entity
@Inheritance(strategy=InheritanceType.JOINED)
public abstract class Pessoa 
{
	@Id
	@Column (insertable = false)
	@GeneratedValue (strategy = GenerationType.SEQUENCE, generator = "pessoa_id_seq")
	private int id;
	private String nome;	
	@OneToMany( cascade = { CascadeType.PERSIST })
	private List<Endereco> enderecos = new ArrayList<Endereco>();
	@OneToMany( cascade = { CascadeType.PERSIST })
	private List<Contato> contatos = new ArrayList<Contato>();
	@OneToMany( cascade = { CascadeType.PERSIST })
	private List<Documento> documentos = new ArrayList<Documento>();

       ....
}

Classe Pessoa_Fisica:

@Entity
public class Pessoa_Fisica extends Pessoa
{	
	@Temporal(TemporalType.DATE)
	private Date data_nasc;
	private String estado_civil;
	private char sexo;
	private String tipo_sangue;
	private char fator_rh;
	private String nacionalidade;
	private String escolaridade;
	private String naturalidade;
	private String profissao;
	private String observacao;
    
        ...
}
F

Meu modelo E/R recebe chaves “burras” em todas as tabelas, não gostaria de alterar. Acho que vou fazer por agregação.

Outra dúvida:

Gostaria de fazer outro tipo de Herança:

PessoaLigth(tabela=pessoa, alguns atributos)
Pessoa(tabela=pessoa, herda PessoaLigth, mais atributos e relacionamentos)

Existe possibilidade de fazer isso ? Usando apenas uma tabela ?

Valeu

F

up

thigo.san

Olá Pessoal… Estou com um problemão no relacionamento 1xN. O sistema que eu estou fazendo tem o entity principal Agent e o entity ContactAgent. O Agent tem uma lista de ContactAgent, no entity do ContactAgent eu quero que apareça o campo AGENTUID(chave primária do entity Agent). Então no sistema quando eu vou salvar o Agent com seus ContactAgent`s ele salva quase tudo certo. No banco os registros são salvos só que o campo AGENTUID na tabela ContactAgent fica nulo. E eu não acho a solução, encontrei bem poucas pessoas com esse problema. Eu uso como banco de dados, o MySql. Vejam os códigos abaixo:

Agent, parte do código onde tem os relacionamentos…

@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
	private List<ContactAgent> listContact = new ArrayList<ContactAgent>();

ContactAgent, parte do código onde tem os relacionamentos…

@ManyToOne
	@JoinColumn(name="AGENTUID")
	private Agent agent;

Classe que persist os registros…

Agent entity = new Agent();
entity.setAgentName(data.getAgentName());
entity.setUsuarioUid(usuarioEntity);
entity.setListContact(contactAgentList);
getEm.persist(entity);

Alguém aí já passou por isso?

Criado 13 de junho de 2007
Ultima resposta 5 de jan. de 2008
Respostas 4
Participantes 3