«ORA-31011: Сбой синтаксического анализа XML» при вставке документа XML в таблицу со столбцом XMLType с использованием Hibernate - PullRequest
3 голосов
/ 28 апреля 2011

Я хочу сохранить данные XML в столбце Oracle XMLType с зарегистрированным файлом схемы XML.И XML-файлы, и схема XSD являются действительными, а XML-файлы соответствуют схеме.Чтобы заставить Hibernate работать с XMLType, я использовал Hibernate mapping Document-XMLType, который можно найти здесь:

http://solecjj.blogspot.com/2011/02/hibernate-with-oracle-xmltype.html

Мой XML-файл отображения Hibernate выглядит так:

...
<hibernate-mapping>
  <class name="cz.zcu.kiv.eegdatabase.data.pojo.ScenarioType1" schema="JPERGLER" table="SCENARIO_TABLE_1">
    <id name="scenarioId" type="int">
      <column name="SCENARIO_ID" precision="22" scale="0"/>
      <generator class="increment"/>
    </id>
    <property name="scenarioXml" type="cz.zcu.kiv.eegdatabase.data.datatypes.OracleXMLType">
      <column name="SCENARIO_XML"/>
    </property>
  </class>
</hibernate-mapping>

И это соответствующий класс POJO:

  public ScenarioType1() {
  }

  public ScenarioType1(int scenarioId, Document scenarioXml) {
    this.scenarioId = scenarioId;
    this.scenarioXml = scenarioXml;
  }

  public int getScenarioId() {
    return scenarioId;
  }

  private void setScenarioId(int scenarioId) {
    this.scenarioId = scenarioId;
  }

  public Document getScenarioXml() {
    return scenarioXml;
  }

  public void setScenarioXml(Document scenarioXml) {
    this.scenarioXml = scenarioXml;
  }

Объект документа создается в классе контроллера и передается объекту DAO в качестве атрибута его объекта POJO:

protected ModelAndView onSubmit(HttpServletRequest request,
HttpServletResponse response, Object command, BindException bindException)
throws Exception {

    MultipartFile xmlFile = data.getDataFileXml();

    ScenarioType1 scenarioType1;
    scenarioType1 = new ScenarioType1();

    ...

    if ((xmlFile != null) && (!xmlFile.isEmpty())) {

        DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
        InputStream inputStream = xmlFile.getInputStream();
        Document doc = docBuilder.parse(inputStream);
        scenarioType1.setScenarioXml(doc);
        inputStream.close();   
    }

    scenarioTypeDao.create(scenarioType1);
...
}

Класс и интерфейс DAO очень просты:

public interface ScenarioTypeDao extends GenericDao<ScenarioType1, Integer> {
}


public class SimpleScenarioTypeDao extends SimpleGenericDao<ScenarioType1, Integer>
                                   implements ScenarioTypeDao {

    public SimpleScenarioTypeDao() {
        super(ScenarioType1.class);
    }
}

Когда обрабатывается метод onSubmit () в классе контроллера, я получаю следующее сообщение об ошибке:

Hibernate: вставить в JPERGLER.SCENARIO_TABLE_1 (SCENARIO_XML, SCENARIO_ID) значения (?,?)

SEVERE: Servlet.service () для диспетчера сервлетов вызвал исключение org.springframework.daailExA:Не удалось очистить сеанс перед закрытием: не удалось выполнить пакетное обновление JDBC;вложенное исключение: org.hibernate.exception.GenericJDBCException: не удалось выполнить пакетное обновление JDBC

...

Причина: org.hibernate.exception.GenericJDBCException: не удалось выполнить пакетное обновление JDBC приorg.hibernate.exception.SQLStateConverter.handledNonSpecificException (SQLStateConverter.java:126) в org.hibernate.exception.SQLStateConverter.convert (SQLStateConverter.java:114) в org.hibernate.exception.JDBCExceptionHelper.vert.vert ()

...

Вызвано: java.sql.BatchUpdateException: ORA-31011: сбой анализа XML

в oracle.jdbc.driver.DatabaseError.throwBatchUpdateException (DatabaseError.Java: 566) в oracle.jdbc.driver.OraclePreparedStatement.executeBatch (OraclePreparedStatement.java:9365) в oracle.jdbc.driver.OracleStatementWrapper.executeBatch (OracleStatementWrapper.java:210) в BatchBatch.java: 70) at org.hibernate.jdbc.AbstractBatcher.executeBatch (AbstractBatcher.java:268)

Похоже, что созданный объект Document заполнен правильными данными, поэтому, похоже, ошибка происходит на стороне отображения Hibernate.Я начинаю чувствовать отчаяние, любая помощь будет оценена.

Это образец XML-файла, который я пытаюсь вставить:

<?xml version="1.0"?>
<scenarios>
  <scenario name="P300" src="p300.xml"/>
  <scenario src="070608_p300.xml" name="070608_p300" />
  <scenario src="cisla_070608.xml" name="cisla_070608" />
</scenarios>
...