Como criar set em hibernate?

pessoal, tentei inúmeros exemplos que eu procurei na internet mas não consegui criar um set no meu programa.
Aqui estão os códigos:
TABELAS SQL:
material

DROP TABLE IF EXISTS `controle_material`.`material`;
CREATE TABLE  `controle_material`.`material` (
  `cod_material` varchar(5) NOT NULL,
  `nome` varchar(150) NOT NULL,
  `estoque` int(10) unsigned DEFAULT NULL,
  PRIMARY KEY (`cod_material`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

solicitacao

DROP TABLE IF EXISTS `controle_material`.`solicitacao`;
CREATE TABLE  `controle_material`.`solicitacao` (
  `cod` int(10) unsigned NOT NULL,
  `matricula` int(10) unsigned DEFAULT NULL,
  `divisao` varchar(45) DEFAULT NULL,
  `ramal` int(10) unsigned DEFAULT NULL,
  `data` datetime DEFAULT NULL,
  `situacao` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`cod`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

pedidos (a que será registrado os dados do set – dependente de solicitacao)

DROP TABLE IF EXISTS `controle_material`.`pedidos`;
CREATE TABLE  `controle_material`.`pedidos` (
  `cod_material` int(10) unsigned NOT NULL,
  `cod_pedido` int(10) unsigned NOT NULL,
  `qtde` int(10) unsigned NOT NULL,
  PRIMARY KEY (`cod_material`,`cod_pedido`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

o mapeamento está ok, já me conecto à base de dados e consigo incluir e remover os itens. Mas como não sei como criar o set estou perdido.

esse eh o map da classe Solicitacao:

[/wmv]<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
  <class name="br.com.bb.model.Solicitacao" table="solicitacao">
    <id name="cod" column="cod" type="integer">
        <generator class="increment"/>
    </id>
    <property name="data" column="data" type="date"/>
    <property name="divisao" column="divisao" type="string"/>
    <property name="matricula" column="matricula" type="integer"/>
    <property name="ramal" column="ramal" type="integer"/>
    <property name="situacao" column="situacao" type="string"/>
  </class>
</hibernate-mapping>

tentei adicionar a tag la também, vi que havia a opção, mas não entendi nadinha.

Agradeço qualquer ajuda ^^

http://docs.jboss.org/hibernate/core/3.3/reference/en/html/collections.html#collections-mapping

ficou assim meu mapeamento, mas não está funcionando T_T


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
  <class name="br.com.bb.model.Solicitacao" table="solicitacao">
      <id name="cod" column="cod" type="integer">
          <generator class="increment"/>
      </id>
      <property name="data" type="date" column="data"/>
      <property name="divisao" type="string" column="divisao"/>
      <property name="hora" type="string" column="hora"/>
      <property name="matricula" type="integer" column="matricula"/>
      <property name="ramal" type="integer" column="ramal"/>
      <property name="situacao" type="string" column="situacao"/>

      <set name="itens" table="itens">
          <key column="cod_solicitacao"/>
          <element column="cod_material" type="integer"/>
      </set>
  </class>
</hibernate-mapping>

tentei executar um teste simples para adicionar com essa estrutura, mas ele me passa o seguinte erro:
Código para adicionar:

 Solicitacao s = new Solicitacao();
        Date d = new Date();
        s.setData(d);
        s.setDivisao("Alguma");
        s.setHora("09:00:00");
        s.setMatricula(1234567);
        s.setRamal(1234);
        s.setSituacao("Pendente");

        Set<Itens> item = new HashSet<Itens>();
        Itens i = new Itens();
        
        i.setCod_solicitacao(1);
        i.setQuantidade(10);
        item.add(i);

        s.setItens(item);

        OperacoesDAO dao = new OperacoesDAO(s);
        dao.adiciona();

ERRO:

07/10/2010 14:15:40 org.hibernate.type.NullableType nullSafeSet
INFO: could not bind value 'br.com.bb.model.Itens@1e5e2c3' to parameter: 2; br.com.bb.model.Itens cannot be cast to java.lang.Integer
Exception in thread "main" java.lang.ClassCastException: br.com.bb.model.Itens cannot be cast to java.lang.Integer
        at org.hibernate.type.IntegerType.set(IntegerType.java:41)
        at org.hibernate.type.NullableType.nullSafeSet(NullableType.java:136)
        at org.hibernate.type.NullableType.nullSafeSet(NullableType.java:107)
        at org.hibernate.persister.collection.AbstractCollectionPersister.writeElement(AbstractCollectionPersister.java:755)
        at org.hibernate.persister.collection.AbstractCollectionPersister.recreate(AbstractCollectionPersister.java:1143)
        at org.hibernate.action.CollectionRecreateAction.execute(CollectionRecreateAction.java:26)
        at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:250)
        at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:234)
        at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:145)
        at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
        at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
        at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
        at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338)
        at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
        at br.com.bb.dao.OperacoesDAO.adiciona(OperacoesDAO.java:34)
        at br.com.bb.dao.AdicionarAlgo.main(AdicionarAlgo.java:42)
Java Result: 1

Deve ser por causa desse

<element column="cod_material" type="integer"/>.

troca por:

 <one-to-many class="br.com.bb.model.Itens"/>

Agora está com outro erro:

org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: br.com.bb.model.Itens
        at org.hibernate.engine.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:219)
        at org.hibernate.type.EntityType.getIdentifier(EntityType.java:397)
        at org.hibernate.type.ManyToOneType.nullSafeSet(ManyToOneType.java:78)
        at org.hibernate.persister.collection.AbstractCollectionPersister.writeElement(AbstractCollectionPersister.java:755)
        at org.hibernate.persister.collection.AbstractCollectionPersister.recreate(AbstractCollectionPersister.java:1143)
        at org.hibernate.action.CollectionRecreateAction.execute(CollectionRecreateAction.java:26)
        at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:250)
        at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:234)
        at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:145)
        at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
        at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
        at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
        at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338)
        at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
        at br.com.bb.dao.OperacoesDAO.adiciona(OperacoesDAO.java:34)
        at br.com.bb.dao.AdicionarAlgo.main(AdicionarAlgo.java:42)
Erro ao gravar objeto.org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: br.com.bb.model.Itens

e no meu código para inserção está assim:

@Override
    public void adiciona() {
        try{
            t = this.SESSAO.beginTransaction();
            this.SESSAO.save(classe);
            t.commit();
            this.SESSAO.close();
        } catch (HibernateException e) {
            System.out.print("Erro ao gravar objeto.");
            System.out.print(e);
            t.rollback();
        }
    }

se eu tentar gravar algo sem o set funciona, com o set não funciona

ainda num consegui axar o erro :x

xá pra lá, não entendi como faz o set com outra classe, mas consigo fazer um com String ou Integer. Resolvi fazer à moda antiga, não encontrei nada sobre como é feita a inserção na base com o mapeamento one-to-many.
eu fiz isso no hbm da classe pai:

<set name="itens" table="pedidos">
        <key column="cod_pedido"/>
        <one-to-many class="br.com.bb.model.Pedidos" />
</set>

e no Bean eu tenho o item:

private Set itens = new HashSet();

até aí tudo bem, mas o incompreendido até o momento foi do hbm. Como que ele sabe quais itens vão ser inseridos no momento em que eu colocar o one-to-many? O key eu descobri que é a chave estrangeira que está na minha tabela.

Agora é só pra aprendizado: Como a associação vai ser feita, ou como o hibernate sabe quais campos ou qual classe é para ser invocada ao colocar o one-to-many?

@Andre
Antes de eu salvar meus itens eu faria o seguinte.

e nesse metodo faria um for sobre os itens setando assim:

Isso se seu relacionamento for bidirecional, ai vc vai conseguir persistir em cascata.

Não funcionou. Eu pedi para mostrar o sql que ele estava gerando e vi que tem coisa errada lá. olha o que ele está tentando fazer:

Hibernate:   
    select  
        max(cod)   
    from  
        solicitacao  
Hibernate:   
    insert   
    into  
        solicitacao  
        (data, divisao, matricula, ramal, situacao, cod)   
    values  
        (?, ?, ?, ?, ?, ?)  
Hibernate:   
    update  
        pedidos   
    set  
        cod_pedido=?   
    where  
        cod_pedido=? 

que parada pé no saco isso kkkkkkkkkkkkk

@Andre
Posta seu Set de itens dentro de solicitacao e posta o HBM do Item tb

Acho q ai fica facil resolver este problema.

Código de teste:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package br.com.bb.dao;

import br.com.bb.model.Pedidos;
import br.com.bb.model.Solicitacao;
import br.com.bb.util.MaterialUtil;
import java.util.HashSet;
import java.util.Set;
import org.hibernate.Session;
import org.hibernate.Transaction;

/**
 *
 * @author André Fróes
 */
public class TestaAdicao {

    public static void main(String[] args){
        Session s = new MaterialUtil().conecta();
        
        Solicitacao sol = new Solicitacao();
        sol.setMatricula(12345627);
        sol.setDivisao("dadsasd");
        sol.setRamal(11231234);
        sol.setSituacao("Pendente");

        Set<Pedidos> itens = new HashSet<Pedidos>();
        itens.add(new Pedidos(10, 20));
        itens.add(new Pedidos(11, 20));
        itens.add(new Pedidos(12, 20));
        itens.add(new Pedidos(13, 20));

        sol.setItens(itens);

        Transaction t = s.beginTransaction();
        s.save(sol);
        s.flush();
        t.commit();
    }
}

Solicitacao.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
  <class name="br.com.bb.model.Solicitacao" table="solicitacao">
    <id name="cod" column="cod" type="integer">
        <generator class="increment"/>
    </id>
    <property name="data" column="data" type="date"/>
    <property name="divisao" column="divisao" type="string"/>
    <property name="matricula" column="matricula" type="integer"/>
    <property name="ramal" column="ramal" type="integer"/>
    <property name="situacao" column="situacao" type="string"/>

    <set name="itens" table="pedidos">
        <key column="cod_pedido"/>
        <one-to-many class="br.com.bb.model.Pedidos"/>
    </set>
  </class>
</hibernate-mapping>

Pedidos.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
  <class name="br.com.bb.model.Pedidos" table="pedidos">
    <id column="cod_pedido" type="integer" name="cod_pedido"/>
    <property name="cod_material" type="integer" column="cod_material"/>
    <property name="qtde" type="integer" column="qtde"/>
  </class>
</hibernate-mapping>

Classe Solicitacao

public class Solicitacao implements Serializable{

    private int cod;
    private int matricula;
    private String divisao;
    private int ramal;
    private Date data;
    private String situacao;
    private Set<Pedidos> itens = new HashSet<Pedidos>();

    //getters e setters
}

Classe Pedidos

public class Pedidos implements Serializable {

    private int cod_material;
    private int cod_pedido;
    private int qtde;

    public Pedidos(int c_material, int q_tde){
        this.setCod_material(c_material);
        this.setQtde(q_tde);
    }

    //getters e setters
}

pra facilitar a visao da base também:
Tabela Solicitacao:

DROP TABLE IF EXISTS `controle_material`.`solicitacao`;
CREATE TABLE  `controle_material`.`solicitacao` (
  `cod` int(10) unsigned NOT NULL,
  `matricula` int(10) unsigned DEFAULT NULL,
  `divisao` varchar(45) DEFAULT NULL,
  `ramal` int(10) unsigned DEFAULT NULL,
  `data` datetime DEFAULT NULL,
  `situacao` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`cod`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Tabela Pedidos:

DROP TABLE IF EXISTS `controle_material`.`pedidos`;
CREATE TABLE  `controle_material`.`pedidos` (
  `cod_material` int(10) unsigned NOT NULL,
  `cod_pedido` int(10) unsigned NOT NULL,
  `qtde` int(10) unsigned NOT NULL,
  PRIMARY KEY (`cod_material`,`cod_pedido`),
  KEY `cod_pedido` (`cod_pedido`),
  CONSTRAINT `pedidos_ibfk_1` FOREIGN KEY (`cod_pedido`) REFERENCES `solicitacao` (`cod`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

isso é tudo ^^

Seguinte acho q esta faltando o atrubuto Solicitacao dentro do Item, pra dizer de q Sol este item faz parte.

ai no HBM do Item coloca algo assim:

<many-to-one name="solicitacao" column="Solicitacao"
class="package.Soliticacao" 
cascade="none" lazy="false"/>  

acho q deve resolver.

Funcionou naum :cry:
Tentei outras coisas também e consegui a inclusão com generator=“increment” no hbm pedidos. Fiz algumas mudanças:
Solicitacao.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
  <class name="br.com.bb.model.Solicitacao" table="solicitacao">
    <id name="cod" column="cod" type="integer">
        <generator class="increment"/>
    </id>
    <property name="data" column="data" type="date"/>
    <property name="divisao" column="divisao" type="string"/>
    <property name="matricula" column="matricula" type="integer"/>
    <property name="ramal" column="ramal" type="integer"/>
    <property name="situacao" column="situacao" type="string"/>

    <set name="itens" table="pedidos" cascade="all" inverse="true">
        <key column="cod_pedido"/>
        <one-to-many class="br.com.bb.model.Pedidos"/>
    </set>
  </class>
</hibernate-mapping>

Pedidos.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
  <class name="br.com.bb.model.Pedidos" table="pedidos">
    <id column="cod_pedido" type="integer" name="cod_pedido"/>
    <property name="cod_material" type="integer" column="cod_material"/>
    <property name="qtde" type="integer" column="qtde"/>
  </class>
</hibernate-mapping>

se no Pedidos eu deixar o id como increment, ele adiciona, mas não é o que eu estou precisando, preciso que ele adicione o código do pedido(solicitacao). Agora este erro está acontecendo:

org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [br.com.bb.model.Pedidos#0]
        at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:168)
        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.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:172)
        at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:94)
        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.bb.dao.TestaAdicao.main(TestaAdicao.java:43)

eu vi alguns posts aqui no guj e tentei fazer a solução, mas nenhuma funcionou.

tente usar os identificadores das suas classes como Long (a classe e não o primitivo) no lugar de int

Alterei tudo nessa disgrama, nada ainda, mas já notei que o erro é que ele não está puxando o id do registro que está sendo inserido. Quer saber?! Vou recomeçar tudo!!! É bug esse danado!

Entao andrre.
para aparecer o codigo da solicitacao, vc tem q colocar o mapeamento como te disse acima, pois eh uma chave extrangeira.
E para persistir em casacada fazer akele esquema de

item.setSolicitacao(situacao)

[]'s