Как использовать Oracle XMLTYPE в Hibernate - PullRequest
3 голосов
/ 29 сентября 2010

Один из столбцов имеет тип XMLTYPE в базе данных Oracle. В моем приложении я хочу сохранить данные и использовать Hibernate.

Я сделал следующее для отображения XMLTYPE в спящем режиме

  1. Определить пользовательский тип, реализующий UserType

  2. Реализация пользовательского типа основана на ссылке в блоге - http://community.jboss.org/wiki/MappingOracleXmlTypetoDocument

  3. но мы не используем пул соединений C3p0, а вместо этого мы используем DBCP

У меня возникла проблема при создании XMLType в пользовательском типе пользователя

XMLType.createXML(st.getConnection(),HibernateXMLType.domToString((Document) value));

где st - подготовленное состояние, переданное методу.

Объект подключения , возвращаемый функцией st.getConnection (), имеет тип org.apache.commons.dbcp.PoolableConnection

Но метод createXML ожидает объект подключения только типа oracle.jdbc.OracleConnection

Я также пытался получить getInnermostDelegate, но это также не работает.

Методы создания XMLTYPE находятся в прилагаемом jar xdb.jar - будут ли какие-либо изменения в зависимости от включенных версий?

Спасибо

+++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++

Получил объект SQLConnection, используя приведенный ниже код -

SimpleNativeJdbcExtractor extractor = new SimpleNativeJdbcExtractor();
PoolableConnection poolableConnection = (PoolableConnection) extractor
                .getNativeConnection(st.getConnection());
Connection sqlConnection = poolableConnection.getInnermostDelegate();

Теперь сообщение об ошибке: java.sql.SQLException: неверный тип столбца

Ниже приведен переопределенный метод

public void nullSafeSet(PreparedStatement st, Object value, int index)
            throws HibernateException, SQLException {

        SimpleNativeJdbcExtractor extractor = new SimpleNativeJdbcExtractor();
        PoolableConnection poolableConnection = (PoolableConnection) extractor
                .getNativeConnection(st.getConnection());
        Connection sqlConnection = poolableConnection.getInnermostDelegate();

        try {
            XMLType xmlType = null;
            if (value != null) {
                xmlType.createXML(sqlConnection, HibernateXMLType
                        .domToString((Document) value));

            }
            st.setObject(index, xmlType);
        } catch (Exception e) {
            e.printStackTrace();
            throw new SQLException(
                    "Could not convert Document to String for storage");
        }
    }

Осталось без понятия ...

Ответы [ 2 ]

0 голосов
/ 17 августа 2013

Я решил ту же проблему, но сопоставил столбец XMLType с java.lang.String в своей сущности, что упростило решение.

Я оставил подробное пошаговое решение какответ на другой вопрос .

0 голосов
/ 30 декабря 2012

Я столкнулся с множеством проблем с использованием XMLType из java, я исправил эту проблему очень простым способом.

Я изменил тип входных данных со стороны oracle DB, с XMLtype на CLOB, затем я легко передаюCLOB и в первой строке хранимой процедуры;Я создал XMLType из CLOB.

CLOB очень прост в Java, просто используйте его как String (statement.setString(1, string);)

...