HIbernate InvalidDataAccessApiUsageException - режим только для чтения

Резюме: Исключение сообщает мне, что транзакция доступна только для чтения; отладочная печать, кажется, указывает на то, что я не нахожусь в режиме только для чтения.

Классы, отредактированные для публикации в Интернете - извините, если я что-то напечатал, но это свод кода, вызывающий у меня проблемы. saveOrUpdate работает при вызове для других типов объектов, но не для этого. Я добавил println в saveOrUpdate во время отладки. Я не писал абстрактный класс, я просто пытаюсь использовать его (а теперь отлаживаю).

Соответствующий вывод под кодом. Не знаю, куда идти.

Обновление после расследования: t написать абстрактный класс, я просто пытаюсь использовать его (а теперь отлаживаю).

Соответствующий вывод под кодом. Не знаю, куда идти.

Обновление после расследования: t написать абстрактный класс, я просто пытаюсь использовать его (а теперь отлаживаю).

Соответствующий вывод под кодом. Не знаю, куда идти.

Обновление после расследования: Я также занимался обновлением конфигурации Spring, и мой коллега указал, что один метод, из которого я вызвал updateAParameter, использовал Spring одним способом, а неработающий метод использовал его другим способом. К сожалению, сломанный способ - это тот путь, к которому я пытался добраться.

Итак, проблема, как я теперь понимаю, заключается в том, что если я создаю экземпляр DataObjectDAOImpl «вручную» в методе, получая bean-компонент, то он позволяет мне писать в ответ в гибернацию правильно. Если я использую spring для установки переменной класса для этого bean-компонента, поэтому мне не нужно создавать его экземпляр в каждом методе, тогда возникает исключение InvalidDataAccessApiUsageException, когда я обращаюсь к методу, который пытается писать в Hibernate, несмотря на то, что он сообщает, что режим только для чтения. У моего коллеги была теория на эту тему, а у меня - нет. Я не понимаю, что он пытался сказать - что-то об извлечении интерфейса из SampleClass.

// Old way that works.
public class SampleClass {
public void someMethod {
ApplicationContext ac = ApplicationContextFactory.getApplicationContext();
DataObjectDAOImpl dodi = ((DataObjectDAOImpl) ac.getBean("dodi"));
//this works
dodi.updateAParameter("foo", exampleDataObject);
}
}

//New way that doesn't work but I would like it to.
public class SampleClass {
private DataObjectDAOImpl dodi = null;
//'dodi' has getter and setter methods that I am not pasting here for simplicity
public void someMethod {    
//causes Exception
dodi.updateAParameter("foo", exampleDataObject);
}
}

и вот соответствующий bean-компонент из конфигурации spring

<bean id="sampleclass" class="com.service.SampleClass" scope="prototype">
    <property name="dodi" ref="doDAOimpl"/>
</bean>

, вот DAOImpl, который одинаков для старого и нового способа

public class DataObjectDAOImpl extends AbstractSpringDaoStuff {

 ...

 public void updateAParameter(String parameter, DataObject do) {
  do.setAParameter(parameter);
  super.saveOrUpdate(do);
 }

}


public abstract class AbstractSpringDaoStuff extends HibernateDaoSupport {

   ...

    @Transactional(readOnly=false)
     protected void saveOrUpdate(Object obj) {
     System.out.println ( "Read-only?: " + TransactionSynchronizationManager.isCurrentTransactionReadOnly () );

         getHibernateTemplate().saveOrUpdate(obj);
     }        
}

Вывод с сервера приложений:

     [java] Read-only?: false
     [java] - Method execution failed:
     [java] org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read-only mode (FlushMode.NEVER/MANUAL): Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction definition.
     [java]     at org.springframework.orm.hibernate3.HibernateTemplate.checkWriteOperationAllowed(HibernateTemplate.java:1186)
     [java]     at org.springframework.orm.hibernate3.HibernateTemplate$16.doInHibernate(HibernateTemplate.java:750)
     [java]     at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:419)
     [java]     at org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374)
     [java]     at org.springframework.orm.hibernate3.HibernateTemplate.saveOrUpdate(HibernateTemplate.java:748)
     [java]     at com.est.dao.AbstractSpringDaoStuff.saveOrUpdate(AbstractSpringDaoMDA.java:24)
etc
6
задан Nathan Spears 7 October 2010 в 08:48
поделиться