【问题标题】:How to Oracle XMLTYPE in Hibernate如何在 Hibernate 中使用 Oracle XMLTYPE
【发布时间】:2011-04-18 15:53:16
【问题描述】:

其中一列是 Oracle 数据库中的 XMLTYPE 类型。 在我的应用程序中,我想保留数据并使用 Hibernate。

我为在休眠中映射 XMLTYPE 做了以下操作

  1. 定义实现 UserType 的自定义用户类型

  2. 自定义用户类型实现基于博客链接-http://community.jboss.org/wiki/MappingOracleXmlTypetoDocument

  3. 我们没有使用 C3p0 连接池,而是使用 DBCP

在自定义用户类型中创建 XMLType 时遇到问题

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

其中 st 是传递给方法的preparedStatement。

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: Invalid column type

下面是被覆盖的方法

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");
        }
    }

现在一无所知...

【问题讨论】:

  • "我也尝试获取 getInnermostDelegate,但这也不起作用。"我总是使用 getInnermostDelegate();它有效。请使用 getInnermostDelegate/* Connection oracleConnection = conn 发送错误; if (conn instanceof org.apache.commons.dbcp.DelegatingConnection) { oracleConnection = ((org.apache.commons.dbcp.DelegatingConnection)conn).getInnermostDelegate(); } */

标签: java oracle hibernate ora-17004


【解决方案1】:

我解决了同样的问题,但将 XMLType 列映射到我的实体中的 java.lang.String,这简化了解决方案。

我留下了详细的,step-by-step solution as an answer to another question

【讨论】:

    【解决方案2】:

    我在使用 java 中的 XMLType 时遇到了很多问题,我解决了这个问题是一个非常简单的方法。

    我将oracle DB端的输入数据类型从XMLtype更改为CLOB,然后我很容易在存储过程的第一行传递了CLOB;我从 CLOB 构建了一个 XMLType。

    CLOB 在 java 中非常简单,只需将其用作 String (statement.setString(1, string);)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多