【问题标题】:Hibernate and spring mvc Deleting and updatingHibernate 和 spring mvc 删除和更新
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 它确实有效,我需要将注释驱动声明到 servlet-context.xml 中,而不是在根上下文中! (您需要根据请求加载它)谢谢!
【解决方案2】:

试试看, 像这样开始/结束这样的交易。

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

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

【讨论】:

    猜你喜欢
    • 2011-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-13
    相关资源
    最近更新 更多