Pregunta

Tengo una pila de primavera/jpa/groovy/hibernate, (nota: no grials), y estoy descubriendo que estoy recibiendo un No session found for current thread Al intentar realizar algunos @Transactional Trabajar en inicio.

Tengo una clase de controlador que, sobre @PostConstruct, invoca un @Transactional Método en otra clase que intenta completar la base de datos con algunos datos de muestra que se utilizarán en una simulación.

Aquí esta la controller clase:

@Component
public class SimulationController {

    private TransactionTemplate transactionTemplate;
    @Autowired
    private PlatformTransactionManager transactionManager;
    @Autowired
    private IPublisher publisher;

    @PostConstruct
    public void intialize()
    {
        this.transactionTemplate = new TransactionTemplate(transactionManager);
        transactionTemplate.execute(new TransactionCallbackWithoutResult() {
            @Override
            protected void doInTransactionWithoutResult(TransactionStatus arg0) {
                racePublisher.populateData();
            }
        });
    }
    //  Also tried, with no success:    
    //  @PostConstruct
    //  public void initialize()
    //  {
    //      publisher.populateData();
    //  }
}

Como puede ver, me he alejado de un puro @Transactional acercarse en el @PostConstruct por razones discutidas aquí.

Mi IPublisher es una clase maravillosa, como sigue:

@Component
class Publisher implements IPublisher {

@Autowired
IStockDAO stockDAO

void populateData()
{
    createStock()
}
@Transactional
void createStock()
{
    def list = [new Stock(ticker: "ADBE", name: "Adobe"),
                new Stock(ticker: "MSFT", venueCode: "Microsoft")]
    list.each { stockDAO.create it }
}

Que es una implementación de:

public interface IPublisher {

    public void populateData();
    public void createStock();
}

Tenga en cuenta que también he intentado marcar populateData() como @Transactional, sin efecto.

En mi clase de contexto de primavera, estoy definiendo <tx:annotation-driven/>.

Por lo que puedo decir, he hecho todo correctamente. Sin embargo, parece que no puedo hacer que esto funcione.

¿Qué más se requiere?

Actualizado:Aquí están los frijoles que configuran mis frijoles relacionados con DataAccess:

<beans>
<bean id="transactionManager"
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>

    <tx:annotation-driven/>

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <property name="url" value="jdbc:mysql://${database.host}:${database.port}/${database.name}" />
        <property name="username" value="${database.username}" />
        <property name="password" value="${database.password}" />
        <property name="initialSize" value="5" />
        <property name="maxActive" value="50" />
    </bean>
    <bean id="sessionFactory"
        class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="packagesToScan">
            <list>
                <value>com.mangofactory.concorde</value>
            </list>
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">${hibernate.dialect}</prop>
                <prop key="hibernate.cache.provider_class">org.hibernate.cache.HashtableCacheProvider
                </prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.format_sql">true</prop>
                <prop key="hibernate.hbm2ddl.auto">update</prop><!--  use create for full drop/create -->
                <prop key="hibernate.connection.autocommit">true</prop>
                <prop key="hibernate.statement_cache.size">0</prop>
                <prop key="hibernate.jdbc.batch_size">20</prop>
            </props>
        </property>
    </bean>
    <beans>
¿Fue útil?

Solución

Deberías usar HibernateTransactionManager en vez de DataSourceTransactionManager.

Otros consejos

Hay problemas básicos con el código. El límite transaccional comienza en el método Createstock de la clase del editor y termina allí. No se propaga a su controlador. Use las llamadas de consulta DB dentro de una transacción. es decir, dentro de un método que tiene la anotación transaccional. De lo contrario, nunca funcionaría.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top