Hibernate + Oracle

0 respostas
M

Ola pessoal, sou novo em java e estou estudando hibernate, eu preciso mapear o seguinte object type do oracle

CREATE OR REPLACE TYPE  "OBJ_FICHAS" under obj_pessoas(
CNPJ Varchar2(18),
Inscricao_Estadual Varchar2(20),
Fantasia Varchar2(40),
status ref obj_status,
classificacao ref obj_classificacao)
/

Depois de pesquisar muito achei o seguinte artigo no própio site do hibernate: [url]http://www.hibernate.org/261.html[/url]

Eu implementei o UserType, e ficou da seguinte forma:

package comercial;

import java.io.Serializable;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Struct;
import java.sql.Types;
import oracle.sql.STRUCT;
import oracle.sql.StructDescriptor;
import org.hibernate.HibernateException;
import org.hibernate.usertype.UserType;

public class categoriausertype implements UserType{
    
    private static final String db_object_type = "obj_classificacao";
    private static final int SQL_TYPE = Types.STRUCT;

    public int[] sqlTypes() {
        return new int[] {SQL_TYPE};
    }

    public Class returnedClass() {
        return categoria.class;
    }

    public boolean equals(Object x, Object y) throws HibernateException {
        if (x == y){
            return true;
        }
        if (x == null || y == null){
            return false;
        }        
        final categoria cat1 = (categoria) x;
        final categoria cat2 = (categoria) y;
        return equals(cat1.getCategoria(), cat2.getCategoria())
        && equals(cat1.getCodigo(), cat2.getCodigo());
        
    }

    public Object nullSafeGet(ResultSet rs, String[] names, Object owner) throws HibernateException, SQLException {
        assert names.length == 1;
        final Struct struct = (Struct) rs.getObject(names[0]);
        if (rs.wasNull()){
            return null;
        }
        final categoria cat = new categoria();
        cat.setCategoria((String) struct.getAttributes()[1] );
        cat.setCodigo( (Integer) struct.getAttributes()[0] );
        return cat;
    }

    public void nullSafeSet(PreparedStatement st, Object value, int index) throws HibernateException, SQLException {
        if (value == null) {
            st.setNull(index, SQL_TYPE, db_object_type);
        } else {
            
            final categoria cat = (categoria) value;
            final Object[] values = new Object[] {cat.getCodigo(),cat.getCategoria()};
            final Connection connection = st.getConnection();
            StructDescriptor sc = StructDescriptor.createDescriptor(db_object_type, connection);
            final STRUCT struct = new STRUCT(sc,connection, values);
            st.setObject(index, struct, SQL_TYPE);
        }
    }

    public Object deepCopy(Object value) throws HibernateException {
        if (value == null){
            return null;
        }
        final categoria cat = (categoria) value;
        final categoria catc = new categoria();
        catc.setCategoria(cat.getCategoria());
        catc.setCodigo(cat.getCodigo());
        return catc;
    }

    public boolean isMutable() {
        return true;
    }

}

O mapeamento ficou da seguinte forma:

<?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="comercial.fichas" table="tb_fichas">
  
  <!-- Identificador da classe -->

  <id name="codigo">
   <generator class="increment"/>
  </id>
  
  <!-- Propriedades da classe -->

  <property name="razao_social" column="nome"/>
  <property name="fantasia" column="fantasia"/>
  <property name="cnpj_cpf" column="cnpj"/>
  <property name="inc_estadual" column="inscricao_estadual"/>
  <property name="Categoria" type="comercial.categoriausertype">
    <column name="classificacao" sql-type="obj_classificacao"/>  
  </property>
  <property name="Status" type="comercial.statususertype"> 
    <column name="status" sql-type="obj_status"/>  
  </property> 
   
 </class>

</hibernate-mapping>

Só q quando eu tento fazer qql coisa eu tenho a seguinte exceção:

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: com.mchange.v2.c3p0.impl.NewProxyConnection cannot be cast to oracle.jdbc.OracleConnection
at oracle.sql.StructDescriptor.createDescriptor(StructDescriptor.java:159)
at oracle.sql.StructDescriptor.createDescriptor(StructDescriptor.java:130)
at comercial.categoriausertype.nullSafeSet(categoriausertype.java:75)
at org.hibernate.type.CustomType.nullSafeSet(CustomType.java:146)
at org.hibernate.persister.entity.AbstractEntityPersister.dehydrate(AbstractEntityPersister.java:1997)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2243)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2660)
at org.hibernate.action.EntityInsertAction.execute(EntityInsertAction.java:56)
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:141)
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 comercial.menu_principal.jButton3MouseClicked(menu_principal.java:174)
at comercial.menu_principal.access$400(menu_principal.java:26)
at comercial.menu_principal$5.mouseClicked(menu_principal.java:80)
at java.awt.AWTEventMulticaster.mouseClicked(AWTEventMulticaster.java:253)
at java.awt.Component.processMouseEvent(Component.java:6041)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3260)
at java.awt.Component.processEvent(Component.java:5803)
at java.awt.Container.processEvent(Container.java:2058)
at java.awt.Component.dispatchEventImpl(Component.java:4410)
at java.awt.Container.dispatchEventImpl(Container.java:2116)
at java.awt.Component.dispatchEvent(Component.java:4240)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4322)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3995)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3916)
at java.awt.Container.dispatchEventImpl(Container.java:2102)
at java.awt.Window.dispatchEventImpl(Window.java:2429)
at java.awt.Component.dispatchEvent(Component.java:4240)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)

Alguem tem alguma idéia de como mapear esse Object Type de qualquer outro jeito ou onde estou errando?
Desde ja agradeço

Criado 25 de fevereiro de 2008
Respostas 0
Participantes 1