Opa galera blz?
Travei em uma parte de um projeto, se alguem poder me ajudar ficarei grato.
Minhas duvidas são as seguintes :
1 )
Tenho uma classe TAREFA e outra FUNCIONÁRIO.
E o relacionamento entre elas é de MUITOS PARA MUITOS.
Na hora de recuperar os dados da classe TAREFA uma exceção é lançada -> LazyInitializationException.
Isso estava acontecendo tbm com a classe FUNCIONÁRIO, só que eu adicionei um fetch= FetchType.EAGER
na anotação @ManyToMany , e isso resolveu o problema.
Pensei que a solução da classe TAREFA era fazer a msm coisa, mais não era pois outro tipo de exceção é lançada -> MultipleBagFetchException
Qual seria a solução para este problema ?
Em um relacionamento muitos para muitos o correto é a criação de 3 tabelas, mais o meu projeto ta criando 4 tabelas no banco de dados
que são :
tarefa
funcionário
tarefa_funcionário
funcionário_tarefa
Eu anotei minha classe de forma errada ?
Segue abaixo as msgs de exceções na pilha e o código para os 2 casos :
EXCEÇÃO .LazyInitializationException
Exception in thread "main" org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: civil.modelo.entidade.Tarefa.funcionarios, no session or session was closed
at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:383)
at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected(AbstractPersistentCollection.java:375)
at org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:368)
at org.hibernate.collection.AbstractPersistentCollection.read(AbstractPersistentCollection.java:111)
at org.hibernate.collection.PersistentBag.iterator(PersistentBag.java:272)
at civil.modelo.entidade.TesteControle.recuperaTarefa(TesteControle.java:72)
at civil.modelo.entidade.TesteControle.executa(TesteControle.java:147)
at civil.modelo.entidade.Main.main(Main.java:49)
EXCEÇÃO MultipleBagFetchException
Exception in thread "main" javax.persistence.PersistenceException: [PersistenceUnit: PersistenciaCivilPU] Unable to build EntityManagerFactory
at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:915)
at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:57)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:48)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:32)
at civil.modelo.entidade.TesteControle.<init>(TesteControle.java:19)
at civil.modelo.entidade.Main.main(Main.java:49)
Caused by: org.hibernate.loader.MultipleBagFetchException: cannot simultaneously fetch multiple bags
at org.hibernate.loader.BasicLoader.postInstantiate(BasicLoader.java:94)
at org.hibernate.loader.entity.EntityLoader.<init>(EntityLoader.java:119)
at org.hibernate.loader.entity.EntityLoader.<init>(EntityLoader.java:71)
at org.hibernate.loader.entity.EntityLoader.<init>(EntityLoader.java:54)
at org.hibernate.loader.entity.BatchingEntityLoader.createBatchingEntityLoader(BatchingEntityLoader.java:133)
at org.hibernate.persister.entity.AbstractEntityPersister.createEntityLoader(AbstractEntityPersister.java:1914)
at org.hibernate.persister.entity.AbstractEntityPersister.createEntityLoader(AbstractEntityPersister.java:1937)
at org.hibernate.persister.entity.AbstractEntityPersister.createLoaders(AbstractEntityPersister.java:3205)
at org.hibernate.persister.entity.AbstractEntityPersister.postInstantiate(AbstractEntityPersister.java:3191)
at org.hibernate.persister.entity.SingleTableEntityPersister.postInstantiate(SingleTableEntityPersister.java:728)
at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:348)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1872)
at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:906)
CLASSE TAREFA
[code]@Entity
@Table(name=“tarefa”)
public class Tarefa implements Serializable {
@Id
@GeneratedValue(strategy= GenerationType.IDENTITY)
@Column(name="id_Tarefa", unique=true, nullable=false)
private Long id;
@Column(length=100)
private String nomeTarefa;
@Temporal(javax.persistence.TemporalType.DATE)
private Date horarioInico;
@ManyToMany
private List<Funcionario> funcionarios;
//getter e setters
}
[/code]
CLASSE FUNCIONÁRIO
[code]@Entity
@Table(name=“funcionario”)
public class Funcionario implements Serializable {
@Id
@GeneratedValue(strategy= GenerationType.IDENTITY)
@Column(name="id_funcionario", unique=true, nullable=false)
private Long id;
@Column(length=255, unique=true, nullable=false)
private String nome;
@ManyToMany(fetch= FetchType.EAGER)
@JoinTable(
name="funcionario_tarefa",
joinColumns={
@JoinColumn(name="id_funcionario",
referencedColumnName="id_funcionario"
)
},
inverseJoinColumns={
@JoinColumn(name="id_tarefa",
referencedColumnName="id_tarefa"
)
}
)
private List<Tarefa> tarefas;
//gatters e setters
}
[/code]
METODO DE QUE PERSISTE FUNCIONARIO
public void create(Funcionario funcionario) {
if (funcionario.getTarefas() == null) {
funcionario.setTarefas(new ArrayList<Tarefa>());
}
EntityManager em = null;
try {
em = getEntityManager();
em.getTransaction().begin();
List<Tarefa> attachedTarefas = new ArrayList<Tarefa>();
for (Tarefa tarefasTarefaToAttach : funcionario.getTarefas()) {
tarefasTarefaToAttach = em.getReference(tarefasTarefaToAttach.getClass(), tarefasTarefaToAttach.getId());
attachedTarefas.add(tarefasTarefaToAttach);
}
funcionario.setTarefas(attachedTarefas);
em.persist(funcionario);
for (Tarefa tarefasTarefa : funcionario.getTarefas()) {
tarefasTarefa.getFuncionarios().add(funcionario);
tarefasTarefa = em.merge(tarefasTarefa);
}
em.getTransaction().commit();
} finally {
if (em != null) {
em.close();
}
}
}
METODO QUE PERSISTE TAREFA
public void create(Tarefa tarefa) {
if (tarefa.getFuncionarios() == null) {
tarefa.setFuncionarios(new ArrayList<Funcionario>());
}
EntityManager em = null;
try {
em = getEntityManager();
em.getTransaction().begin();
List<Funcionario> attachedFuncionarios = new ArrayList<Funcionario>();
for (Funcionario funcionariosFuncionarioToAttach : tarefa.getFuncionarios()) {
funcionariosFuncionarioToAttach = em.getReference(funcionariosFuncionarioToAttach.getClass(), funcionariosFuncionarioToAttach.getId());
attachedFuncionarios.add(funcionariosFuncionarioToAttach);
}
tarefa.setFuncionarios(attachedFuncionarios);
em.persist(tarefa);
for (Funcionario funcionariosFuncionario : tarefa.getFuncionarios()) {
funcionariosFuncionario.getTarefas().add(tarefa);
funcionariosFuncionario = em.merge(funcionariosFuncionario);
}
em.getTransaction().commit();
} finally {
if (em != null) {
em.close();
}
}
}
Foi mal pelo post gigante, mais faz tempo que eu travei nessa parte e não achei soluções, vlw galera.