Olá Pessoal,
Primeiramente agradeço poder estar aqui, hoje, falando sobre algo tão interessante.
Pelo menos pra mim. Sou programador PHP no dia a dia mas não vejo a hora do fim de semana chegar para estudar JAVA.
Estou seguindo a apostila do curso FJ26 da Caelum. Nesta tem um pouco de relations do hibernate, mas não muito. Então andei caçando por ai alguns exemplos e discussões na web.
Tenho a seguinte situação, resolvida, mas resolução esta qual não entendi nada.
Supondo o relacionamento entre 2 entidades: Pessoa, Endereço.
Sendo que:
Uma ou mais pessoas podem possuir o mesmo endereço.
Uma pessoa pode ter mais de um endereço.
Assim, nosso relacionamento sendo de N x N, precisamos de uma tabela relacional para alocar as relações.
Seria esta a entidade: pessoa_endereco
Qual, por exemplo, poderia ter o seguinte registro:
pessoa_id | endereco_id
1 -------------- 1
1 -------------- 2
2 -------------- 1
2 -------------- 2
Ou seja, a pessoa 1 possui os mesmos dois endereços da pessoa 2.
Nota: Um exemplo de negócio seria ter na base um casal de advogados com dois escritórios.
Como estão minhas classes:
CLASSE Pessoa
@Entity
@Table(name="PESSOA")
public class Pessoa {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
private String nome;
private String cpf;
@ManyToMany(fetch = FetchType.LAZY)
@JoinColumn(name="endereco_id")
private List<Endereco> endereco;
/** G AND S **/
}
CLASSE Pessoa
@Entity
@Table(name="ENDERECO")
public class Endereco {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
private String logradouro;
private String numero;
@ManyToMany(targetEntity=Pessoa.class, fetch = FetchType.LAZY)
@JoinTable(
name="pessoa_endereco",
joinColumns=@JoinColumn(name="endereco_id"),
inverseJoinColumns=@JoinColumn(name="pessoa_id")
)
private List<Pessoa> pessoa;
}
Main de inserção e listagem (debugando)
public class EnderecoPessoaInDAO {
@SuppressWarnings("unchecked")
public static void main(String[] args){
Session session = HiberbateUtils.openSession();
Transaction t = session.beginTransaction();
EnderecoDAO enderecoDAO = new EnderecoDAO(session, Endereco.class);
PessoaDAO pessoaDAO = new PessoaDAO(session, Pessoa.class);
t.begin();
try{
Endereco e = new Endereco();
e.setLogradouro("Rua cantagalo 1801");
e.setNumero("1901");
Endereco e2 = new Endereco();
e2.setLogradouro("Rua cantagalo 1801");
e2.setNumero("1901");
List<Endereco> end = new ArrayList();
end.add(e2);
end.add(e);
Pessoa p = new Pessoa();
p.setNome("Davi de Féo");
p.setCpf("012456789");
p.setEndereco(end);
Pessoa p2 = new Pessoa();
p2.setNome("Sandra matias");
p2.setCpf("0987654321");
p2.setEndereco(end);
enderecoDAO.saveOrUpdate(e);
enderecoDAO.saveOrUpdate(e2);
pessoaDAO.saveOrUpdate(p);
pessoaDAO.saveOrUpdate(p2);
}catch (Exception e) {
t.rollback();
System.out.println(e.getMessage());
}
t.commit();
Pessoa p = (Pessoa) pessoaDAO.load(1L);
for(Endereco e: p.getEndereco()){
System.out.println(e.getId());
System.out.println("Pessoas no endereco:");
for(Pessoa pIn: e.getPessoa()){
System.out.println(pIn.getNome());
}
}
}
}
Resultado do main (apenas da listagem):
Hibernate:
select
pessoa0_.id as id1_0_,
pessoa0_.cpf as cpf1_0_,
pessoa0_.nome as nome1_0_
from
PESSOA pessoa0_
where
pessoa0_.id=?
Hibernate:
select
endereco0_.PESSOA_id as PESSOA1_1_1_,
endereco0_.endereco_id as endereco2_1_,
endereco1_.id as id3_0_,
endereco1_.logradouro as logradouro3_0_,
endereco1_.numero as numero3_0_
from
PESSOA_ENDERECO endereco0_
inner join
ENDERECO endereco1_
on endereco0_.endereco_id=endereco1_.id
where
endereco0_.PESSOA_id=?
2
Pessoas no endereco:
Hibernate:
select
pessoa0_.endereco_id as endereco1_3_1_,
pessoa0_.pessoa_id as pessoa2_1_,
pessoa1_.id as id1_0_,
pessoa1_.cpf as cpf1_0_,
pessoa1_.nome as nome1_0_
from
pessoa_endereco pessoa0_
inner join
PESSOA pessoa1_
on pessoa0_.pessoa_id=pessoa1_.id
where
pessoa0_.endereco_id=?
Davi de Féo
Sandra matias
1
Pessoas no endereco:
Hibernate:
select
pessoa0_.endereco_id as endereco1_3_1_,
pessoa0_.pessoa_id as pessoa2_1_,
pessoa1_.id as id1_0_,
pessoa1_.cpf as cpf1_0_,
pessoa1_.nome as nome1_0_
from
pessoa_endereco pessoa0_
inner join
PESSOA pessoa1_
on pessoa0_.pessoa_id=pessoa1_.id
where
pessoa0_.endereco_id=?
Davi de Féo
Sandra matias
Então ficam as questões:
O resultado me atendeu no que queria mas está correta a tratativa, é assim mesmo o relacionamento para este caso?
Na entidade Endereco coloquei o mesmo @JoinColumn(name=“endereco_id”) da entidade Pessoa.
Seria a propriedade name da annotation @JoinColumn a chave de ligação entre as entidades ?
Outra coisa é:
Perceberam que salvei os registros individualmente, ou seja, sem utilizar o cascade. O cascade é usual e seguro em que casos?
Desde já agradecido,
Jsgin