Dúvida de Hibernate

8 respostas
E

Caro

Tenho o seguinte modelo:
banco:
Pessoa

  • idPessoa
  • nome

Usuario

  • idPessoa - pk de usuario e fk de usuario para pessoa

no hibernate:
Usuario herda de Pessoa. A minha estratégia é @Inheritance(strategy = InheritanceType.JOINED) que se encontra em Pessoa

Pergunta: eu posso criar um usuário para uma pessoa que já existe ?? posso fazer isso usando só hibernate ?

A minha realidade é que os meus usuários criam uma pessoa primeio para depois cadastrá-la como usuario. funcionário e etc

Eu posso fazer isso modelando essas classes como herança ?

O que eu acho é que se eu modeli nas classes ele como herança não tem como eu criar um usuário ligando ele a uma pessoa
já existente. Se eu quero criar um usuário e associá-lo a uma pessoa já existente eu não poderia usar herança. Logicamente
eu posso dar um insert um usuário por fora e no final das contas eu vou ter o que eu quero (com herança). Mas isso não é
o correto, é isso mesmo ?

Desde já gradeço a atenção de vocês

8 Respostas

ze_kiefa

Mais dúvidas

  1. Tanto na modelagem como em OO, um usuário não possui apenas uma pessoa relacionada?
  2. Por qual motivo ter dois usuários para a mesma pessoa?

Ex:

Pessoa

  • idPessoa = 1
  • nome = JP

Usuario1

  • idUsuario = 1
  • idPessoa = 1
  • login = login1

Usuario2

  • idUsuario = 2
  • idPessoa = 1
  • login = login2

Você comentou que a pessoa é criada primeiro, posteriormente o usuário, funcionário etc.
Se esse for o caso, você teria três entidades: Pessoa, Usuario e Funcionario, na qual a estratégia de herança se aplicaria sem problemas.

Ex:
Pessoa

  • idPessoa = 1
  • nome = JP

Usuario

  • idUsuario = 1
  • idPessoa = 1
  • login = login1

Funcionario

  • idFuncionario = 1
  • idPessoa = 1
  • codFuncional = 01544

Entendeu?

E

Entendi o que você quis dizer

Mas minha dúvida é a seguinte:

Eu realmente tenho uma tabela Pessoa e seus filhos (tabelas que extends ela) seriam funcionario, usuario, aluno e
etc. No meu caso aqui eu tenho sempre primeiro ele cadastrado como Pessoa (na tebal pessoa). Depois
que seriam criados os seus vinculos. Uma pessoa pode ser dois alunos (pq tem matriculas diferentes), um usuário e
outros vinculos, EX.:

Pessoa
Pessoa 1
Pessoa 2

Aluno
Aluno 1 - Pessoa 1
Aluno 2 - Pessoa 1
Aluno 3 - Pessoa 2

Usuario
Usuario 1 - Pessoa 1

E assim por diante

Então, a minha pergunta é se eu tenho um cidadão cadastrado em Pessoa (ela ainda não tem vinculos).
Eu usando herança

Em pessoa
@Entity
@Inheritance(strategy = InheritanceType.JOINED)

Em Funcionario por exemplo
@PrimaryKeyJoinColumn(name=“idPessoa”)

eu posso criar um aluno e vincular esse NOVO aluno a uma pessoa JÁ EXISTENTE, ou
quando eu crio um NOVO aluno eu automaticamente eu já to criando uma NOVA pessoa

Aluno.setNomePessoa(Nome da pessoa)

Aluno.setMatricula(2008-5878)

dao.saveOrUpdate(aluno)

Se eu fizer isso eu vou estar criando um novo aluno e uma nova pessoa, por aluno herdar pessoa

Segue abaixo o código do mapeamento

@Entity
@SuppressWarnings("serial")
@Table(name = "cmmPessoa")
@Inheritance(strategy = InheritanceType.JOINED)
public class Pessoa extends GenericCompare implements Validator {

        private int id;

        private String nome;

}


@Entity
@Table(name = "cmmUsuario")
@SuppressWarnings("serial")
@PrimaryKeyJoinColumn(name="idPessoa")
public class Usuario extends Pessoa  {

	private String matricula;

}
ze_kiefa

Esse artigo deve ajudar.

http://openk.com.br/blog/2007/11/06/mapeando-heranca-no-hibernate-3/

E

Explicando melhor

Eui tenho Pessoa e Usuario

Usuario herda de Pessoa

Eu consigo criar um Usuário e associá-lo a uma Pessoa que á existe ??

Usando hibernate … consigo ??

ze_kiefa

A associação é feita automaticamente pelo Hibernate, ou seja, quando um Usuario é salvo, o Hibernate se encarrega de salvar (persistir) também a Pessoa.
Tenho que pesquisar mais a respeito se há como fazer ‘manualmente’ essa asociação, isto é, ligar um Usuario a uma Pessoa já existente.

E

Caros

Essa é uma dúivida que os colegas aqui do trabalho tem

Na minha opnião a coisa ocorre assim:

Tenho no banco as tabelas Pessoa e Aluno por exemplo

No hibernate (domínio) tenho Pessoa e Aluno sendo que Aluno herda de pessoa

Se eu crio um Aluno eu automaticamente estou criando uma Pessoa

aluno.seNome(“nome”) // esse atributo é de pessoa
aluno.setMatricula(“matricula”) //atributo de aluno

isso acontece pq aluno herda de pessoa

Se eu podesse associa um Aluno a uma pessoa já existente, teria que usar associação 1 para n ou
1 para 1, e não herança

Isso acontece pq se eu tenho primeiro uma pessoa e quero vê-la (da um cast) como aluno eu não consigo,
o java naum deixa, pois eu naum posso ver um pai como filho. Naum posso ver uma Pessoa como Aluno,
só posso ver Aluno como pessoa.

Essa é única certza que eu tenho

Os colegas querem criar primeiro uma Pessoa e depois criar seus vinculos. sendo que no modelo de classe
(no hibernate ) querem criar um usuário a associá-lo a uma pessoa. Isso usando HERANÇA, o que na minha
humilde opnião não dá certo. Teria que usar ASSOCIAÇÃO.

Pessoa
in idPessoa
String nomePessoa

Aluno
int idAluno
Pessoa pessoa

Que acham ??

ze_kiefa

Concordo com o seu ponto de vista.
Ajustando as classes, ficaria algo assim:

@Entity
class Pessoa{
 @id
 private int idPessoa;
 
 @OneToMany
 private Set<Usuario> usuarios;
}

@Entity
class Usuario{
 @Id
 private int idUsuario;
 
 @ManyToOne
 private Pessoa pessoa;
}

Será que atende ao requisito do primeiro post?

E

Ok garoto

Criado 11 de março de 2008
Ultima resposta 11 de mar. de 2008
Respostas 8
Participantes 2