【发布时间】:2012-02-15 15:26:47
【问题描述】:
我们正在使用 Spring MVC 和 hibernate 开发一个 Spring 应用程序。现在我们遇到了一个无法解决的问题。当我们尝试删除某些内容时,问题就出现了。
如果我们删除页面,则加载正常,并且像一切都成功一样继续前进,但不会删除数据库中的值。
这是我们的代码:
这是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");
}
}
这是休眠配置:
<!-- 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 的值。
【问题讨论】:
-
你打过flush吗?可能这有助于stackoverflow.com/questions/5235868/…
-
@thinksteep 我们可以调用 flush() 但它会关闭会话,这是我们不想要的,因为有时我们需要做几个事务。
-
我知道为什么你的测试不工作,因为弹簧测试被设计成不提交事务,你可以在 TestServiceImpl 中的 delete 方法上做 @Rollback(false) 应该这样做,就网络而言您是否启用了查询日志记录并检查了查询是否正确,包括绑定参数
-
@PrasannaTalakanti 我没有运行单元测试。我正在通过浏览器在网络浏览器中对其进行测试。我得到的唯一查询是:Hibernate: select test0_.testId as testId14_, test0_.testNaam as testNaam14_, test0_.testGetal as testGetal14_ from test test0_ where test0_.testId=?
-
这意味着只有你的 get 查询正在执行,而 delete 永远不会被执行,不知道为什么,你能先运行你的测试,看看它是否适用于 RollBack false 并且实体被删除
标签: java mysql hibernate spring spring-mvc