soned
Julho 16, 2010, 3:32pm
#1
saudações…
estou com uma dúvida aki. Tenho 2 classes mapeadas, estão abaixo:
public class Cliente implements java.io.Serializable{
@Id
@GeneratedValue(strategy=GenerationType.AUTO, generator="INC_CLIENTE")
private Integer idCliente;
@Column
private String nome;
@Column
private String site;
@Column
private String cpfCnpj;
@OneToMany(mappedBy="idCliente")
private List<Telefone> telefones;
e
public class Telefone implements java.io.Serializable{
@Id
@GeneratedValue(strategy=GenerationType.AUTO, generator="INC_TELEFONE")
private Integer idTelefone;
@ManyToOne()
@JoinColumn(name="IDCLIENTE")
private Cliente idCliente;
@Column
private String telefone;
tenho uma classe ClienteDao, e essa classe contém o seguinte método:
protected <T extends Serializable> T readById(Integer id, Class<T> type) {
Session session = getSession();
Serializable toReturn = null;
try {
toReturn = (Serializable) session.get(type, id);
session.getTransaction().commit();
} catch (Exception ex) {
session.getTransaction().rollback();
} finally{
session.close();
return (T) toReturn;
}
}
quando vou recuperar um registro do banco de dados e tentar escrevê-lo na tela functiona tudo bem até a parte da lista de telefones. Me mostra um erro:
16/07/2010 15:14:26 org.hibernate.LazyInitializationException
SEVERE: failed to lazily initialize a collection of role: scgp.model.pojo.Cliente.telefones, no session or session was closed
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: scgp.model.pojo.Cliente.telefones, no session or session was closed
at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:358)
at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected(AbstractPersistentCollection.java:350)
at org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:343)
at org.hibernate.collection.AbstractPersistentCollection.read(AbstractPersistentCollection.java:86)
at org.hibernate.collection.PersistentBag.iterator(PersistentBag.java:249)
at scgp.model.dao.ClienteDaoTest.testLerPorId(ClienteDaoTest.java:94)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:73)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:46)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:180)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:41)
at org.junit.runners.ParentRunner$1.evaluate(ParentRunner.java:173)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
at org.junit.runners.ParentRunner.run(ParentRunner.java:220)
at junit.framework.JUnit4TestAdapter.run(JUnit4TestAdapter.java:39)
at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:515)
at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:1031)
at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:888)
se eu tiro o session.close, fica tudo blza. Minha dúvida é sobre o session.close, quero dizer, eu preciso fechá-la não é? Como eu faço, não posso simplismente tirar essa linha. Alguém tem alguma idéia?
soned
Julho 16, 2010, 4:41pm
#3
ok amigo, obrigado. Resolveu meu problema…
@OneToMany(mappedBy="idCliente",fetch=FetchType.EAGER)
private List<Telefone> telefones;
Desse modo a lista de telefones é carregada junto com o cliente todas as vezes.
Se essa for sua vontade taí a solução, mas se na maioria das vezes vc nao precisar da lista de telefones, vc estaria fazendo consultas desnecessarias ao banco, nesse caso aconselho deixar como está e chamar a lista ainda com a session aberta que carrega a lista apenas quando vc precisar. (OBS: apenas pra dar load não precisa de transaction)