Olá, drsmachado.
Pelo que andei pesquisando, o Hibernate não aceita identificador composto, portanto será necessário criar uma classe do tipo identificador.
Então fiz o seguinte:
Classe ItemBiblioteca:
@ManyToMany(fetch= FetchType.LAZY)
@JoinTable(name = "ItemBibliotecaAutor", joinColumns = {
@JoinColumn(name = "CodItemBiblioteca", referencedColumnName="CodItemBiblioteca", nullable=false)}, inverseJoinColumns = {
@JoinColumn(name = "CodAutor", referencedColumnName="CodAutor", nullable=false)})
@Cascade(CascadeType.SAVE_UPDATE)
private Collection<Autor> autor;
Get e Set:
[code]
public Collection getCodAutor() {
return autor ;
}
public void setCodAutor(Collection<Autor> autor) {
this.autor = autor;
}[/code]
Classe Autor:
@ManyToMany(fetch= FetchType.LAZY, mappedBy="autor")
@JoinTable(name = "ItemBibliotecaAutor", joinColumns = {
@JoinColumn(name = "CodAutor", referencedColumnName="CodAutor", nullable=false)}, inverseJoinColumns = {
@JoinColumn(name = "CodItemBiblioteca", referencedColumnName="CodItemBiblioteca", nullable=false)})
@Cascade(CascadeType.SAVE_UPDATE)
private Collection<ItemBiblioteca> itemBiblioteca;
Get e Set
public Collection<ItemBiblioteca> getCodItemBiblioteca() {
return itemBiblioteca;
}
public void setCodItemBiblioteca(Collection<ItemBiblioteca> itemBiblioteca) {
this.itemBiblioteca = itemBiblioteca;
}
Classe ItemBibliotecaAutor:
[code]
@Entity
@Table(name = “ItemBibliotecaAutor”)
public class ItemBibliotecaAutor implements Serializable {
@EmbeddedId
private ItemBibliotecaAutorPK ChaveComposta;
}[/code]
Classe ItemBibliotecaAutorPK:
[code]
@Embeddable
public class ItemBibliotecaAutorPK implements Serializable {
@ManyToOne(fetch= FetchType.EAGER)
@JoinColumn(name="CodAutor")
@Cascade(CascadeType.SAVE_UPDATE)
private Autor autor;
@ManyToOne(fetch= FetchType.EAGER)
@JoinColumn(name="CodItemBiblioteca")
@Cascade(CascadeType.SAVE_UPDATE)
private ItemBiblioteca itemBiblioteca;
}[/code]
Rodei o meu código de teste:
[code]
Session secao = HibernateUtil.getSessionFactory().openSession();
Editora editora = (Editora) secao.load(Editora.class, 2);
Secao s = (Secao) secao.load(Secao.class, 2);
Collection<Autor> a = (Collection<Autor>) secao.get(Autor.class, 1);
LivroDAO livroDAO = new LivroDAO();
Livro l = new Livro();
l.setCodItemBiblioteca(11);
l.setCodEditora(editora);
l.setCodSecao(s);
l.setCodAutor(a);
l.setTitulo("Capitu");
l.setNuReferencia(23424234);
l.setEdicao(2);
l.setAnoEdicao(1990);
l.setNumeroExemplar(9);
l.setVolume(1);
l.setIsbn(234578);
l.setDataCadastro(new Date());
livroDAO.salvar(l);
}
[/code]
E deu novamente o mesmo erro:
[color=red]Exception in thread “main” java.lang.ClassCastException: br.com.Dominio.Autor cannot be cast to java.util.Collection
at br.com.Testes.TesteConexao.main(TesteConexao.java:42) [/color]
Então, utilizei os códigos da Criteria:
[code]Session secao = HibernateUtil.getSessionFactory().openSession();
Editora editora = (Editora) secao.load(Editora.class, 2);
Secao s = (Secao) secao.load(Secao.class, 2);
Criteria criteria = secao.createCriteria(Autor.class);
Collection<Autor> a = (Collection<Autor>) criteria.list();
LivroDAO livroDAO = new LivroDAO();
Livro l = new Livro();
l.setCodItemBiblioteca(11);
l.setCodEditora(editora);
l.setCodSecao(s);
l.setCodAutor(a);
l.setTitulo("Capitu");
l.setNuReferencia(23424234);
l.setEdicao(2);
l.setAnoEdicao(1990);
l.setNumeroExemplar(9);
l.setVolume(1);
l.setIsbn(234578);
l.setDataCadastro(new Date());
livroDAO.salvar(l);
[/code]
E deu o seguinte erro:
[color=red]Exception in thread “main” org.hibernate.HibernateException: Illegal attempt to associate a collection with two open sessions
at org.hibernate.collection.AbstractPersistentCollection.setCurrentSession(AbstractPersistentCollection.java:410)
at org.hibernate.event.def.OnUpdateVisitor.processCollection(OnUpdateVisitor.java:43)
at org.hibernate.event.def.AbstractVisitor.processValue(AbstractVisitor.java:101)
at org.hibernate.event.def.AbstractVisitor.processValue(AbstractVisitor.java:61)
at org.hibernate.event.def.AbstractVisitor.processEntityPropertyValues(AbstractVisitor.java:55)
at org.hibernate.event.def.AbstractVisitor.process(AbstractVisitor.java:123)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performUpdate(DefaultSaveOrUpdateEventListener.java:293)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:223)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:89)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)
at org.hibernate.impl.SessionImpl.fireSaveOrUpdate(SessionImpl.java:507)
at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:499)
at org.hibernate.engine.CascadingAction$5.cascade(CascadingAction.java:218)
at org.hibernate.engine.Cascade.cascadeToOne(Cascade.java:268)
at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:216)
at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:169)
at org.hibernate.engine.Cascade.cascadeCollectionElements(Cascade.java:296)
at org.hibernate.engine.Cascade.cascadeCollection(Cascade.java:242)
at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:219)
at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:169)
at org.hibernate.engine.Cascade.cascade(Cascade.java:130)
at org.hibernate.event.def.AbstractSaveEventListener.cascadeAfterSave(AbstractSaveEventListener.java:456)
at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:334)
at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:181)
at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:121)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:187)
at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:33)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:172)
at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:27)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)
at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:535)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:523)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:519)
at br.com.Persistencia.GenericHibernateDAO.salvar(GenericHibernateDAO.java:65)
at br.com.Testes.TesteConexao.main(TesteConexao.java:61)[/color]
Na parte [color=red]at br.com.Persistencia.GenericHibernateDAO.salvar(GenericHibernateDAO.java:65)[/color] arremete para a seguinte linha
@SuppressWarnings("unchecked")
@Override
public T salvar(T entidade) {
Transaction transacao = getSession().beginTransaction();
getSession().save(entidade);
transacao.commit();
getSession().close();
return entidade;
}
Especificamente na linha getSession().save(entidade);
[color=red]at br.com.Testes.TesteConexao.main(TesteConexao.java:61)[/color] o erro arremete para a seguinte linha livroDAO.salvar(l);
Quando utilizei o outro código, deu erro no q.list();
Aí me restou uma dúvida:
A classe ItemBibliotecaAutorPK deve estar lá no BD?
Será que o erro persiste por que a Classe ItemBiblioteca recebe 2 relacionamentos de N:1 e ainda um de N:N? E na hora de cadastrar, preciso pegar o codigo da editora e da seção que está a obra!
E aí o que faço? :shock: