Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Проблемы с spring JPA transactions


Автор: Andrey1 17.4.2010, 10:44
Не понимаю, почему вылетает exception: java.lang.ClassCastException: $Proxy204 cannot be cast to com.ap.jpa.dao.UserDao

Конфиг Spring JPA:

Код

...
   <bean id="entityManagerFactory"
          class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                <property name="generateDdl" value="false" />
                <property name="database" value="MYSQL" />
                <property name="showSql" value="false" />
            </bean>
        </property>

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory" />
        <property name="dataSource" ref="dataSource" />
    </bean>

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

    <bean id="userDao" class="com.ap.jpa.dao.UserDao"         />
...


Код

@Transactional
public class UserDao extends com.szczytowski.genericdao.impl.GenericDao<User, Integer> implements IUserDao {
...
}


Код

public interface IUserDao extends com.szczytowski.genericdao.api.IDao<User, Integer>, UserDetailsService {
}


GenericDao:
Код

public class GenericDao<T extends IEntity<I>, I extends Serializable> implements IDao<T, I> {

    @PersistenceContext
    protected EntityManager entityManager;
...

Автор: Andrey1 17.4.2010, 15:58
Завелись JPA транзакции пока только через TransactionTemplate:

Код

    <bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
        <property name="transactionManager">
            <ref bean="transactionManager"/>
        </property>
    </bean>


Код

public class UserDao extends GenericDao<User, Integer> implements IUserDao {

    private TransactionTemplate transactionTemplate;

...

    public void saveUser(final User user)
    {
        getTransactionTemplate().execute(
                new TransactionCallback() {
                    public Object doInTransaction(TransactionStatus ts)
                    {
                        try
                        {
                           save(user);
                        } catch (Exception e)
                        {
                            ts.setRollbackOnly();
                        }
                        return null;
                    }
                });
    }

}


Правда, щас получается, что все методы Dao, для которых требуется транзакция нужно переписывать (что - грустно, и возникает вопрос, зачем тогда нужно GenericDao...).

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)