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