@ Транзакционные вопросы и как использовать с @Service - PullRequest
1 голос
/ 16 марта 2012

Мой сервис использует универсальный DAO (который явно использует фабрику сессий Hibernate). Я потратил некоторое время, прежде чем обнаружил эту ошибку

org.hibernate.HibernateException: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here

Я аннотировал свой сервис и все работает отлично. Теперь я хочу использовать сканирование контекстного пути и удалить эту строку из моей конфигурации:

<bean id="societaService" class="it.trew.prove.services.SocietaService" />

Итак ... вот мой окончательный вариант:

@Service
@Transactional(readOnly = true)
public class SocietaService {

    private Dao societaDao;

    @Autowired
    public void setSocietaDao(Dao societaDao) {
        this.societaDao = societaDao;
    }

    public void salvaSocieta(Societa s) {
        societaDao.save(s);
    }

    public List<Societa> listAll() {
        return societaDao.getAll(Societa.class);
    }

    public void deleteById(Long id) {
        societaDao.delete(getSocieta(id));
    }

    public Societa getSocieta(String id) {
        return getSocieta(Long.parseLong(id));
    }

    public Societa getSocieta(Long id) {
        return societaDao.get(Societa.class, id);
    }
}

Добавление аннотации @Service заставляет мое приложение выдавать ужасную ошибку гибернации выше. Зачем? Удаление @Service и настройка служебного компонента через xml = работает. ПОЧЕМУ ??

Дополнительно:

  • делает ли транзакция, аннотирующая мой класс обслуживания, все свои методы для выполнения в транзакции?

EDIT

Вот мой контекст xml:

<context:annotation-config />   
<context:component-scan base-package="it.trew.prove" /> 

<!--  Hibernate -->

<bean id="myDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.google.appengine.api.rdbms.AppEngineDriver" />
<property name="url" value="jdbc:google:rdbms://xxx:xxx/xxx" />
</bean>


<bean id="mySessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="dataSource" ref="myDataSource" />
    <property name="annotatedClasses">
        <list>
            <value>it.trew.prove.model.beans.Scadenza</value>
            <value>it.trew.prove.model.beans.Fornitore</value>
            <value>it.trew.prove.model.beans.Societa</value>
        </list>
    </property>
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
            <prop key="hibernate.show_sql">true</prop>
            <prop key="hibernate.hbm2ddl.auto">create</prop>
            <!-- <prop key="hibernate.hbm2ddl.import_files">/setup.sql</prop> -->
        </props>
    </property>
</bean>

<tx:annotation-driven transaction-manager="transactionManager" />

<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="mySessionFactory" />
</bean> 

Ответы [ 2 ]

3 голосов
/ 16 марта 2012

Вы включили аннотации?

<context:annotation-config />

и

<context:component-scan base-package="org.example"/>

это включит аннотации, такие как @Service, @Component и @ Repository

1 голос
/ 16 марта 2012

Прежде всего, вам нужно указать Spring, чтобы включить аннотацию Transactional, например:

<tx:annotation-driven transaction-manager="transactionManager" />

Во-вторых, если вы используете @Transactional на уровне класса, любой вызов метода вашей службы будетбыть транзакционным.Начинает ли транзакция или нет, зависит от атрибута «распространение».По умолчанию используется начальный, если ни один не был запущен в этом сеансе (Propagation.REQUIRED).Если вы используете @Transactional только на уровне класса, все ваши методы будут наследовать его атрибуты, т. Е. Если вы установите «readOnly = true», все ваши методы будут доступны только для чтения, поэтому обновления / сохранения / удаления не будут работать,Я бы порекомендовал вам прочитать больше Spring Transaction Management Doc

...