Почему Spring @Transactional возвращает старые данные и как я могу получить их, чтобы они возвращали обновленные данные? - PullRequest
1 голос
/ 21 марта 2012

Я использую Spring 3.1.0.RELEASE с Hibernate 4.0.1.Final.Я пытаюсь использовать диспетчер транзакций Spring, но у меня возникла проблема, когда Spring возвращает старые данные для метода find.В моем приложении Spring я вызываю метод save, а затем метод find.После того, как я вызвал save, я вижу изменения в базе данных, но когда я вызываю find, он возвращает старое состояние объекта.Вот методы контроллера ...

// method to save
@RequestMapping(method = RequestMethod.POST)
public String saveUserEventFeeds(final HttpServletRequest request, 
                                 @ModelAttribute("eventFeeds") final Set<EventFeed> eventFeeds) {
    final String nextPage = "user/eventfeeds";
    try { 
        final String[] eventFeedIds = request.getParameterValues("userEventFeeds");
        final Set<EventFeed> userEventFeeds = new HashSet<EventFeed>();
        if (eventFeedIds != null) { 
            for (final String eventFeedId : eventFeedIds) {
                final EventFeed eventFeed = getEventFeed(eventFeeds, Integer.parseInt(eventFeedId));
                userEventFeeds.add(eventFeed);
            }   // for
        }   // if
        final Registration currentUser = (Registration) securityContextFacade.getContext().getAuthentication().getPrincipal();
        userService.saveUserEventFeeds(currentUser.getId(), userEventFeeds);
    } catch (Exception exc) { 
        LOG.error(exc.getMessage(), exc);
    }   // try
    return nextPage;
} // saveUserEventFeeds

// method to retrieve user
@ModelAttribute("user")
public UserDetails getUser() {
    final Registration reg = (Registration) securityContextFacade.getContext().getAuthentication().getPrincipal();
    final int id = reg.getId();
    final Registration foundUser = userService.findUserById(id);
    return (UserDetails) foundUser;
}   // getUser

, а вот служба, в которой я объявляю все транзакции ...

@Transactional(rollbackFor = Exception.class)
@Component("userService")
public class UserServiceImpl implements UserService {

...
@Override
public void saveUserEventFeeds(Integer userId, Set<EventFeed> eventFeeds) {
    final Registration searchUser = new Registration();
    searchUser.setId(userId);
    final Registration user = usersDao.getUser(searchUser);
    if (user != null) {
        user.setUserEventFeeds(eventFeeds);
        usersDao.saveUser(user);
    } else { 
        throw new RuntimeException("User with id " + userId + " not found.");
    }   // if
}

@Override
public Registration findUserById(Integer id) {
    final Registration searchUser = new Registration();
    if (id != null) { 
        searchUser.setId(id);
    }   // if
    return usersDao.getUser(searchUser);
}   

Ниже представлен менеджер транзакций, который я объявилфайл контекста приложения.Если вы видите, как я могу настроить вещи по-другому, чтобы я мог получать самые последние данные о моих находках, пожалуйста, дайте мне знать.

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/myproj"/>
    <property name="username" value="myproj"/>
    <property name="password" value="password"/>
    <property name="maxActive" value="10"/> 
    <property name="minIdle" value="5"/> 
    <!-- SELECT 1 is a simple query that returns 1 row in MySQL -->
    <property name="validationQuery" value="SELECT 1"/> 
</bean>

<bean class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" id="sessionFactory">
    <property name="dataSource" ref="dataSource" />
    <property name="annotatedClasses">
        <list>
            <value>com.myco.myproj.domain.Registration</value>
            <value>com.myco.myproj.domain.Role</value>
            <value>com.myco.myproj.domain.EventFeed</value>
        </list>
    </property>
    <property name="hibernateProperties">
        <props>
            <prop key="show_sql">true</prop>
            <prop key="dialect">org.hibernate.dialect.MySQLDialect</prop>
        </props>
    </property>
</bean>

<bean id="transactionManager"
    class="org.springframework.orm.hibernate4.HibernateTransactionManager"
    p:sessionFactory-ref="sessionFactory" />

<tx:annotation-driven />
...