Ajuda Hibernate Muitos para Muitos

2 respostas
sorrisosv

Pessoal,
Nao estou conseguindo fazer uma associacao muitos pra muitos atualizar na tabela diretamente.
Tenho o objeto cliente que tem varios locais e quando adiciono um local a ele o Hibernate apenas adiciona na tabela do local e nao na tabela de associacao local_cliente. Nao estranhem que tem alguns caracteres esquisitos no nome, isso funciona ok.
???
Alguem jah teve esse problema.
Muito obrigado pela ajuda…

Meu código e os mapeamentos…

<hibernate-mapping>
    <class name="br.com.sensorweb.novo.Cliente" table=""Cliente"" dynamic-update="true"
           dynamic-insert="true" select-before-update="false">
        <id column="id" name="id" type="integer">
            <generator class="native">
                <param name="sequence">"Cliente_id_seq"</param>
            </generator>
        </id>
        <property column="email" name="email" not-null="true" type="string"/>
        <property column=""desc"" name="desc" type="string"/>
        <property column=""razaoSocial"" name="razaoSocial" not-null="true" type="string"/>
        <property column=""nomeFantasia"" name="nomeFantasia" not-null="true" type="string"/>
        <property column="ativo" name="ativo" not-null="false" type="boolean"/>
        <property column=""pessoaJuridica"" name="pessoaJuridica" not-null="true" type="boolean"/>
        <property column=""baseCliente"" name="baseCliente" not-null="true" type="string"/>
        <set cascade="all" inverse="true" lazy="true"  name="locais" table=""Cliente_Local"">
            <key column=""idCliente""/>
            <many-to-many class="br.com.sensorweb.novo.Local" column=""idLocal""/>
        </set>
        <set cascade="all" inverse="true" lazy="true"  name="planos" table=""Cliente_Plano"">
            <key column=""idCliente""/>
            <many-to-many class="br.com.sensorweb.novo.Plano" column=""idPlano""/>
        </set>
    </class>
</hibernate-mapping>


public class Cliente implements Serializable {

    private int id;
    private String email;
    private String desc;
    private String razaoSocial;
    private String nomeFantasia;
    private boolean ativo;
    private boolean pessoaJuridica;
    private String baseCliente;
    private Collection<Local> locais = new HashSet<Local>();
    private Collection<Plano> planos = new HashSet<Plano>();

    public Collection<Plano> getPlanos() {
        return planos;
    }

    public void setPlanos(Collection<Plano> planos) {
        this.planos = planos;
    }










public class Local implements Serializable {

    private int id;
    private String desc;
    private String celular;
    private String fax;
    private String telefone;
    private String complemento;
    private String logradouro;
    private int numero;
    private String cep;
    private String bairro;
    private boolean padrao;
    private Collection<Cliente> clientes = new HashSet<Cliente>();







<hibernate-mapping>
    <class name="br.com.sensorweb.novo.Local" table=""Local"" dynamic-update="true"
           dynamic-insert="true" select-before-update="false">
        <id column="id" name="id" type="integer">
            <generator class="native">
                <param name="sequence">"Local_id_seq"</param>
            </generator>
        </id>
        <property column=""desc"" name="desc" not-null="true" type="string"/>
        <property column="celular" length="10" name="celular" type="string"/>
        <property column="fax" length="10" name="fax" type="string"/>
        <property column="telefone" length="10" name="telefone" type="string"/>
        <property column="complemento" name="complemento" type="string"/>
        <property column="logradouro" name="logradouro" type="string"/>
        <property column="numero" name="numero" type="integer"/>
        <property column="cep" length="8" name="cep" type="string"/>
        <property column="bairro" name="bairro" type="string"/>
        <property column="padrao" name="padrao" type="boolean"/>

        <set cascade="all" lazy="true" inverse="false" name="clientes" table=""Cliente_Local"" >
            <key column=""idLocal""/>
            <many-to-many class="br.com.sensorweb.novo.Cliente" column=""idCliente"" />
        </set>
    </class>
</hibernate-mapping>









  public static void saveCliente(Cliente cli) {
        Session dbMCASession = HibernateUtil.currentSession();


//        List<Cliente> clientesList = dbMCASession.createCriteria(br.com.sensorweb.novo.Cliente.class).list();

        Transaction tx = null;
        try {
            System.out.println("antes de commit");
            tx = dbMCASession.beginTransaction();

            dbMCASession.saveOrUpdate(cli);
            dbMCASession.flush();


            tx.commit();
            dbMCASession.close();
        } catch (RuntimeException e) {
            if (tx != null && tx.isActive()) {
                try {
                    // Second try catch as the rollback could fail as well
                    tx.rollback();
                } catch (HibernateException e1) {
                    e1.printStackTrace();
                }
                // throw again the first exception
                throw e;
            }
        }
    }



    public static void main(String[] args) {
//        ClienteMB cl = new ClienteMB();
        Cliente cc = (Cliente) HibernateUtil.currentSession().createCriteria(br.com.sensorweb.novo.Cliente.class).add(Expression.eq("id", 40)).uniqueResult();
//        Cliente aa = clientesList.get(clientesList.size());
        Collection<Local> cl = cc.getLocais();
        System.out.println(""+cl.size());
        Local l = new Local("","","","","","",0,"","",false);

        cc.getLocais().add(l);
        for (Local local : cl) {
            System.out.println("" + local.getDesc());
        }
        ClienteDAO.saveCliente(cc);
    }

2 Respostas

_fs

Voce precisa que o relacionamento seja bidirecional?

De qualquer forma, tente salvar o Local antes de salvar o cliente.

sorrisosv

Valeu,
jah tentei isso. mas mesmo assim. o problema eh que o hibernate nem começa a fazer o insert na tabela de associaçao.
Abraços

pára aqui:

Hibernate: select nextval (’“Local_id_seq”’)
Hibernate: insert into “Local” (“desc”, celular, fax, telefone, complemento, logradouro, numero, cep, bairro, padrao, id) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)

Criado 16 de julho de 2010
Ultima resposta 16 de jul. de 2010
Respostas 2
Participantes 2