Я хочу сохранить данные 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>