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: http://www.hibernate.org/261.html
Eu implementei o UserType, e ficou da seguinte forma:
[code]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;
}
}
[/code]
O mapeamento ficou da seguinte forma:
[code]<?xml version="1.0" encoding="UTF-8"?>
[/code]
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