2012-02-15 72 views
3

我们正在开发Spring MVC和休眠的Spring应用程序。现在我们遇到了一个我们无法解决的问题。当我们尝试删除某些内容时,问题就随之而来。休眠和弹簧mvc删除和更新

如果我们删除页面只是加载正常,并进一步像一切都成功,但数据库中的值不会被删除。

这里是我们的代码:

这是TestDao

@Repository 
public class TestDaoImpl implements TestDao { 

    @Autowired 
    private SessionFactory sessionFactory; 

    @Override 
    public Test get(int id) { 
     return (Test)this.sessionFactory.getCurrentSession().createQuery("FROM Test WHERE id =:ident").setParameter("ident",id).uniqueResult(); 
    } 

    @Override 
    public void delete(int id) { 

     this.sessionFactory.getCurrentSession().delete(this.get(id)); 

    } 
} 

这是我们的服务(业务层)

@Service("testService") 
public class TestServiceImpl implements TestService { 

    private final TestDao testDao; 

    @Inject 
    public TestServiceImpl(TestDao testDao) 
    { 
     this.testDao = testDao; 
    } 

    @Override 
    @Transactional 
    public void delete(int id) { 
      testDao.delete(id); 
    } 
} 

这是控制器:

@Controller 
public class TestingController { 

    @Qualifier("testService") 
    @Autowired 
    private TestService testService; 

    @RequestMapping(value = "/testing") 
    public ModelAndView testing() 
    { 
     testService.delete(1); 
     return new ModelAndView("home"); 
    } 

} 

这是Hibernate的配置:

<!-- Parse database properties --> 
    <context:property-placeholder location="classpath:db/db.properties"/> 

    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
     <property name="mappingResources"> 
      <list> 
       <value>db/mappings/User.hbm.xml</value> 
       <value>db/mappings/Authority.hbm.xml</value> 
       <value>db/mappings/Car.hbm.xml</value> 
       <value>db/mappings/Address.hbm.xml</value> 
       <value>db/mappings/DrivingDay.hbm.xml</value> 
       <value>db/mappings/Message.hbm.xml</value> 
       <value>db/mappings/Ride.hbm.xml</value> 
       <value>db/mappings/RouteAgreement.hbm.xml</value> 
       <value>db/mappings/Route.hbm.xml</value> 
       <value>db/mappings/RouteTime.hbm.xml</value> 
       <value>db/mappings/SocialMediaLogin.hbm.xml</value> 
       <value>db/mappings/Variables.hbm.xml</value> 
       <value>db/mappings/Waypoint.hbm.xml</value> 
       <value>db/mappings/Test.hbm.xml</value> 
      </list> 
     </property> 
     <property name="dataSource"> 
      <ref bean="dataSource"/> 
     </property> 
     <property name="hibernateProperties"> 
      <props> 
       <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop> 
       <prop key="hibernate.hbm2ddl.auto">update</prop> 
       <prop key="hibernate.show_sql">true</prop> 
      </props> 
     </property> 
    </bean> 

    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
     <property name="driverClassName" value="${jdbc.driverClassName}"/> 
     <property name="url" value="${jdbc.url}"/> 
     <property name="username" value="${jdbc.username}"/> 
     <property name="password" value="${jdbc.password}"/> 
    </bean> 

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

我知道这是一个代码墙上,我感到很抱歉,但我想我提供尽可能多的细节尽可能。

在此先感谢

编辑:没有与数据库中的ID值1。

+0

你有没有调用flush?可能是这个帮助http://stackoverflow.com/questions/5235868/hibernate-is-not-deleting-my-objects-why – kosa 2012-02-15 15:41:58

+0

@thinksteep我们可以调用flush(),但它关闭会话,这是我们不想要,因为有时我们需要做几个交易。 – 2012-02-15 15:44:17

+0

我知道为什么你的测试不工作,因为春季测试的目的不是提交事务,你可以对TestServiceImpl中的删除方法执行@Rollback(false),它应该这样做,至于网页是否启用了查询日志记录和检查查询是否正确,包括绑定参数 – 2012-02-15 16:11:39

回答

2

你的xml中可能缺少tx:annotation-driven - 这是触发为@Transaction注释bean创建代理的一个 - 如果请求不在事务中,则删除将不起作用。

+0

它确实有效,我需要声明注释驱动到servlet-context.xml中,而不是在根上下文中! (您需要根据请求加载它)谢谢! – 2012-02-15 22:26:22

0

尝试, 像这样封闭你的transcation像开始/结束。

Transaction tx = session.beginTransaction(); 
// your operation. 
tx.commit(); 

看起来操作在代码执行后回滚。你需要提交交易。

+0

这也行不通。 – 2012-02-15 15:57:42