diff --git a/.classpath b/.classpath
index 9fc2de7..de70241 100644
--- a/.classpath
+++ b/.classpath
@@ -6,28 +6,28 @@
-
+
+
-
+
-
-
+
-
+
-
+
diff --git a/pom.xml b/pom.xml
index 0c971a1..38908db 100644
--- a/pom.xml
+++ b/pom.xml
@@ -60,6 +60,11 @@
5.1.10
+
+ cglib
+ cglib
+ 3.1
+
\ No newline at end of file
diff --git a/src/main/java/br/com/akato/hibernate/Endereco.java b/src/main/java/br/com/akato/hibernate/Endereco.java
index 218bf2e..6e19827 100644
--- a/src/main/java/br/com/akato/hibernate/Endereco.java
+++ b/src/main/java/br/com/akato/hibernate/Endereco.java
@@ -29,7 +29,14 @@ public Endereco(String logradouro,Long numero){
this.numero = numero;
}
+ public Endereco(String logradouro,Long numero, Pessoa pessoa){
+ this.logradouro = logradouro;
+ this.numero = numero;
+ this.pessoa = pessoa;
+ }
+ public Endereco(){
+ }
diff --git a/src/main/java/br/com/akato/hibernate/Pessoa.java b/src/main/java/br/com/akato/hibernate/Pessoa.java
index dd959c9..4b78243 100644
--- a/src/main/java/br/com/akato/hibernate/Pessoa.java
+++ b/src/main/java/br/com/akato/hibernate/Pessoa.java
@@ -11,48 +11,68 @@
import javax.persistence.Table;
@Entity
-@Table(name="pessoa")
+@Table(name = "pessoa")
public class Pessoa {
+ public Pessoa() {
+
+ }
+
@Id
@GeneratedValue
- @Column(name="pessoa_id")
+ @Column(name = "pessoa_id")
private Long id;
-
+
private String nome;
private Long cpf;
-
- @OneToMany(mappedBy="pessoa")
+
+ @OneToMany(mappedBy = "pessoa")
private Set enderecos;
-
-
-
- public Pessoa(String nome,Long cpf){
+
+ public Pessoa(String nome, Long cpf) {
this.nome = nome;
this.cpf = cpf;
this.enderecos = new HashSet();
}
-
+
+ // apenas para o exemplo de CGLIB
+ public Pessoa(Long id) {
+ this.id = id;
+ }
+
+ //
public String getNome() {
return this.nome;
}
+
public void setNome(String nome) {
this.nome = nome;
}
+
public Long getCpf() {
return cpf;
}
+
public void setCpf(Long cpf) {
this.cpf = cpf;
}
+
public Set getEnderecos() {
return enderecos;
}
+
public void setEnderecos(Set enderecos) {
this.enderecos = enderecos;
}
-
+
public void addEndereco(Endereco endereco) {
this.enderecos.add(endereco);
}
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
}
diff --git a/src/main/java/br/com/akato/hibernate/PessoaDAO.java b/src/main/java/br/com/akato/hibernate/PessoaDAO.java
index c9d76aa..333dfa8 100644
--- a/src/main/java/br/com/akato/hibernate/PessoaDAO.java
+++ b/src/main/java/br/com/akato/hibernate/PessoaDAO.java
@@ -23,7 +23,7 @@ public PessoaDAO(Session session){
public void salva(Pessoa p){
this.session.save(p);
- this.salvaEndereco(p);; //adicionado agora
+ this.salvaEndereco(p);
}
private void salvaEndereco(Pessoa p){
diff --git a/src/main/java/br/com/akato/hibernate/TestaPessoaDAO.java b/src/main/java/br/com/akato/hibernate/TestaPessoaDAO.java
index 98cf7a8..234d5f3 100644
--- a/src/main/java/br/com/akato/hibernate/TestaPessoaDAO.java
+++ b/src/main/java/br/com/akato/hibernate/TestaPessoaDAO.java
@@ -4,26 +4,55 @@
public class TestaPessoaDAO {
public static void main(String[]Args){
+ criarContatosNaBase();
+ executaProxyamentoParaAcessarObjetoNaoCarregado();
+ lancaLazyException();
+ }
+
+ static void criarContatosNaBase(){
Session session = new HibernateUtil().getSession();
- Pessoa pessoa = new Pessoa("Arthur Kato",38742425875L);
- Endereco endereco = new Endereco("El.Grajau",292L);
+ PessoaDAO pessoadao = new PessoaDAO(session);
+ Pessoa pessoa = new Pessoa("Renato De Melo",31180069279l);
+ Endereco endereco = new Endereco("Al. Rio Negro",291l,pessoa);
+ Endereco enderecoB = new Endereco("Al. Cauaxi",721l,pessoa);
pessoa.addEndereco(endereco);
- PessoaDAO dao = new PessoaDAO(session);
+ pessoa.addEndereco(enderecoB);
session.beginTransaction();
- dao.salva(pessoa);
+ pessoadao.salva(pessoa);
session.getTransaction().commit();
- System.out.println(" Foi adicionado a pessoa : " + pessoa.getNome());
-
+ }
+ static void executaProxyamentoParaAcessarObjetoNaoCarregado(){
+ Session session = new HibernateUtil().getSession();
+ System.out.println("Sessao Aberta");
+ PessoaDAO pessoadao = new PessoaDAO(session);
+ Pessoa pessoa = pessoadao.busca(3l);
+ Object enderecoProxy = pessoa.getEnderecos();
+ System.out.println("O objeto de persistencia com inicializacao `tardia` esta sendo proxyado");
+ org.hibernate.proxy.HibernateProxy objeto = (org.hibernate.proxy.HibernateProxy) pessoa;
+ System.out.println("Para o o objet Pessoa foi gerado um objeto Proxy" + objeto.getClass());
+ org.hibernate.collection.internal.PersistentSet persistentSet = (org.hibernate.collection.internal.PersistentSet) enderecoProxy;
+ System.out.println("O Set de Enderecos foi proxiado pela classe : " + persistentSet.getClass() + " , valor : "+ persistentSet.toString());
session.close();
-
-
+ System.out.println("Sessao Fechada");
+ System.out.println(""+pessoa.getNome()+":");
+ for(Endereco endereco:pessoa.getEnderecos()){
+ System.out.println(" Endereco de Id : " + endereco.getId() +", : " + endereco.getLogradouro() + endereco.getNumero());
+ }
}
+ static void lancaLazyException(){
+ Session session = new HibernateUtil().getSession();
+ PessoaDAO pessoadao = new PessoaDAO(session);
+ Pessoa pessoa = pessoadao.busca(3l);
+ session.close();
+ System.out.println("-------------------------------");
+ System.out.println("Sessao Fechada");
+ System.out.println(""+pessoa.getNome()+":");
+ for(Endereco endereco:pessoa.getEnderecos()){
+ System.out.println(" Endereco de Id : " + endereco.getId() +", : " + endereco.getLogradouro() + endereco.getNumero());
+ }
-}
-//System.out.println(" Foi adicionada a pessoa : " + p.getNome());
+ }
-//pessoa.setNome("Arthur Kato");
-//pessoa.setCpf(38742425875L);
-//
+}
diff --git a/src/main/java/br/com/akato/hibernate/proxy/MyFakeList.java b/src/main/java/br/com/akato/hibernate/proxy/MyFakeList.java
new file mode 100644
index 0000000..17b8ed7
--- /dev/null
+++ b/src/main/java/br/com/akato/hibernate/proxy/MyFakeList.java
@@ -0,0 +1,18 @@
+package br.com.akato.hibernate.proxy;
+
+public class MyFakeList {
+ private Object[] objetos = new Object[10];
+ private int size = 0;
+
+ public void add(T t){
+ this.objetos[size] = t;
+ size++;
+ }
+ public int getSize(){
+ return this.size;
+ }
+ @SuppressWarnings("unchecked")
+ public T get(int ref){
+ return (T) this.objetos[ref];
+ }
+}
diff --git a/src/main/java/br/com/akato/hibernate/proxy/MyInterceptor.java b/src/main/java/br/com/akato/hibernate/proxy/MyInterceptor.java
new file mode 100644
index 0000000..a62104b
--- /dev/null
+++ b/src/main/java/br/com/akato/hibernate/proxy/MyInterceptor.java
@@ -0,0 +1,25 @@
+package br.com.akato.hibernate.proxy;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+import net.sf.cglib.proxy.MethodInterceptor;
+import net.sf.cglib.proxy.MethodProxy;
+
+public class MyInterceptor implements MethodInterceptor {
+ public MyInterceptor(){}
+
+ public MyInterceptor(MyFakeList fakeList){
+ this();
+ this.fakeList = fakeList;
+
+ }
+
+ private MyFakeList fakeList;
+
+ public Object intercept(Object object, Method method, Object[]args,MethodProxy methodProxy) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException{
+ System.out.println("--------------Meu Proxy em Ação--------------------");
+ System.out.println("Excutando método interceptado : " + method.getName());
+ return method.invoke(fakeList, args);
+ }
+}
diff --git a/src/main/java/br/com/akato/hibernate/proxy/MyProxyCGLIBService.java b/src/main/java/br/com/akato/hibernate/proxy/MyProxyCGLIBService.java
new file mode 100644
index 0000000..f67f131
--- /dev/null
+++ b/src/main/java/br/com/akato/hibernate/proxy/MyProxyCGLIBService.java
@@ -0,0 +1,24 @@
+package br.com.akato.hibernate.proxy;
+
+import net.sf.cglib.proxy.Enhancer;
+import br.com.akato.hibernate.Pessoa;
+
+public class MyProxyCGLIBService {
+ public MyFakeList criarListaFake(){
+ final MyFakeList exemplo = new MyFakeList();
+ MyInterceptor c = new MyInterceptor(exemplo);
+ MyFakeList objetoProxiado = (MyFakeList) Enhancer.create(MyFakeList.class,c);
+ return objetoProxiado;
+ }
+
+ public static void main(String[] args) {
+ MyFakeList list = new MyProxyCGLIBService().criarListaFake();
+ list.add(new Pessoa(1l));
+ list.add(new Pessoa(2l));
+ list.add(new Pessoa(3l));
+ int qtdeItens = list.getSize();
+ Pessoa p = list.get(2);
+ System.out.println(String.format("Id: %d ", p.getId()));
+ System.out.println(String.format("Qtde Itens na lista: %d ", qtdeItens));
+ }
+}
diff --git a/target/classes/br/com/akato/hibernate/Endereco.class b/target/classes/br/com/akato/hibernate/Endereco.class
index 806a119..07616b8 100644
Binary files a/target/classes/br/com/akato/hibernate/Endereco.class and b/target/classes/br/com/akato/hibernate/Endereco.class differ
diff --git a/target/classes/br/com/akato/hibernate/Pessoa.class b/target/classes/br/com/akato/hibernate/Pessoa.class
index ed1c851..41a7d5c 100644
Binary files a/target/classes/br/com/akato/hibernate/Pessoa.class and b/target/classes/br/com/akato/hibernate/Pessoa.class differ
diff --git a/target/classes/br/com/akato/hibernate/TestaPessoaDAO.class b/target/classes/br/com/akato/hibernate/TestaPessoaDAO.class
index 14c9511..42847ff 100644
Binary files a/target/classes/br/com/akato/hibernate/TestaPessoaDAO.class and b/target/classes/br/com/akato/hibernate/TestaPessoaDAO.class differ
diff --git a/target/classes/br/com/akato/hibernate/proxy/MyFakeList.class b/target/classes/br/com/akato/hibernate/proxy/MyFakeList.class
new file mode 100644
index 0000000..98d0d27
Binary files /dev/null and b/target/classes/br/com/akato/hibernate/proxy/MyFakeList.class differ
diff --git a/target/classes/br/com/akato/hibernate/proxy/MyInterceptor.class b/target/classes/br/com/akato/hibernate/proxy/MyInterceptor.class
new file mode 100644
index 0000000..5c2c56e
Binary files /dev/null and b/target/classes/br/com/akato/hibernate/proxy/MyInterceptor.class differ
diff --git a/target/classes/br/com/akato/hibernate/proxy/MyProxyCGLIBService.class b/target/classes/br/com/akato/hibernate/proxy/MyProxyCGLIBService.class
new file mode 100644
index 0000000..81a438b
Binary files /dev/null and b/target/classes/br/com/akato/hibernate/proxy/MyProxyCGLIBService.class differ