2016-04-06 6 views
0

Ich erstelle ein einfaches Projekt mit Spring4 + Hibernate4. Ich implementiere die CRUD-Funktionen, aber ich finde die Update-Operation funktioniert nicht mit Annotation @Transactional.Annotation @Transactional wirkt sich nicht auf Speichern im Frühjahr und Winterschlaf Projekt

Wenn Sie session.flush() hinzufügen, können die Daten aktualisiert werden.

Aber ich habe @Transactional in meinem Code, warum muss ich flush() verwenden?

feder common.xml:

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

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClassName" value="com.mysql.jdbc.Driver"></property> 
    <property name="url" value="jdbc:mysql://localhost:3306/cang7"></property> 
    <property name="username" value="root"></property> 
    <property name="password" value="phpwind.net"></property> 
</bean> 

<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource"></property> 
    <property name="hibernateProperties"> 
     <props> 
      <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop> 
      <prop key="hibernate.hbm2ddl.auto">update</prop> 
      <prop key="hibernate.show_sql">true</prop> 
      <prop key="hibernate.format_sql">true</prop> 
     </props> 
    </property> 
    <property name="packagesToScan"> 
     <list> 
      <value>com.study.user.domain</value> 
     </list> 
    </property> 
</bean> 

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

feder mvc.xml

<context:component-scan base-package="com.study.user"> 
    <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service" /> 
</context:component-scan> 

<mvc:annotation-driven /> 
<mvc:resources location="/js/" mapping="/js/**"/> 

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
    <property name="prefix" value="/"></property> 
    <property name="suffix" value=".jsp"></property> 
</bean> 

mein UserDAO:

@Repository 
public class UserDAO implements IUserDAO { 

private static final Logger logger = Logger.getLogger(UserDAO.class); 

@Resource(name = "sessionFactory") 
private SessionFactory sessionFactory; 

public void setSessionFactory(SessionFactory sessionFactory) { 
    this.sessionFactory = sessionFactory; 
} 

@Override 
public User getUser(int id) { 
    String hql = "from User u where u.userId=?"; 
    Query query = sessionFactory.getCurrentSession().createQuery(hql); 
    query.setInteger(0, id); 
    return (User) query.uniqueResult(); 
} 

@SuppressWarnings("unchecked") 
@Override 
public List<User> getAllUser() { 
    String hql = "from User"; 
    Query query = sessionFactory.getCurrentSession().createQuery(hql); 
    return query.list(); 
} 

@Override 
public void addUser(User user) { 
    sessionFactory.getCurrentSession().save(user); 

} 

@Override 
public boolean deleteUser(User user) { 
    // TODO Auto-generated method stub 
    return false; 
} 

@Override 
public boolean updateUser(User user) { 
    Session session = sessionFactory.getCurrentSession(); 
    session.saveOrUpdate(user); 
    return false; 
} 

} 

mein Service:

@Service("userService") 
public class UserService implements IUserService { 

@Resource 
private IUserDAO userDAO; 



@Override 
@Transactional 
public void updateUser(User user) { 
    userDAO.updateUser(user); 
} 

} 

mein Controller:

@Controller 
@RequestMapping("/user") 
public class UserController { 

@Resource(name = "userService") 
private IUserService userService; 

@RequestMapping("/getAllUser") 
public String getAllUser(HttpServletRequest request) { 

    request.setAttribute("userList", userService.getAllUser()); 

    return "/index"; 
} 

@RequestMapping("/getUser") 
public String getUser(int id, HttpServletRequest request) { 

    request.setAttribute("user", userService.getUser(id)); 

    return "/editUser"; 
} 

@RequestMapping("/toAddUser") 
public String toAddUser() { 
    return "/addUser"; 
} 

@RequestMapping("addUser") 
public String addUser(User user, HttpServletRequest request) { 
    userService.addUser(user); 
    return "redirect:/user/getAllUser"; 
} 

@RequestMapping("updateUser") 
public String updateUser(User user, HttpServletRequest request) { 
    userService.updateUser(user); 
    return "redirect:/user/getAllUser"; 
} 

}

+1

Wie ist Ihr 'updateUser' Methode aufgerufen sollte hinzufügen, haben Sie eine' hibernate.properties' oder 'hibernate.cfg.xml' wenn es so schreiben. –

+0

Erhalten Sie 'UserDAO' aus einem Spring-Kontext? –

+0

Ich habe meinen Code aktualisieren, bitte helfen Sie einen Blick ~ –

Antwort

0

Ich habe dieses Problem zu beheben.

Der Grund ist, dass der UserService zweimal geladen wird. ich in meinem feder mvc.xml

<context:component-scan base-package="com.study.user" > 
    <context:exclude-filter type="annotation"  expression="org.springframework.stereotype.Service" /> 
    </context:component-scan> 
Verwandte Themen