Java Hibernate/Spring回滚插入,无错误

Java Hibernate/Spring回滚插入,无错误,java,hibernate,spring,Java,Hibernate,Spring,我有两个类,Foo和FooType,其中FooType只是数据库中代表3种可能类型的3行。我在Hibernate中确实映射了FooType,但是除了ID和description字段之外,没有其他内容。FooType hbm文件中没有映射回Foo 在Foo中,我有一个多对一映射,因为每个Foo都需要一个类型 <hibernate-mapping> <class name="com.blah.domain.Foo" table="foos" lazy="false">

我有两个类,Foo和FooType,其中FooType只是数据库中代表3种可能类型的3行。我在Hibernate中确实映射了FooType,但是除了ID和description字段之外,没有其他内容。FooType hbm文件中没有映射回Foo

在Foo中,我有一个多对一映射,因为每个Foo都需要一个类型

<hibernate-mapping>
    <class name="com.blah.domain.Foo" table="foos" lazy="false">
        <id name="id" type="int">
            <column name="id" />
            <generator class="identity" />
        </id>
    <many-to-one name="type" class="com.blah.domain.FooType" column="type" not-null="true" unique="false" update="false" fetch="join"/>
    </class>
</hibernate-mapping>
当我运行createFoo时,我没有看到任何错误,但是在我的MySQL日志中,我看到了
Insert
语句,后面紧跟着
rollback
。我已经为Hibernate打开了完整的日志记录,但是我没有看到任何错误。当我将insert从日志中复制出来并在mysql中手动运行时,效果很好,这可能是最令人困惑的事情


我刚开始冬眠,所以我想这可能是我在多对一映射中做错了什么,但我无法在我的一生中弄清楚这一点。对于我可能做错的问题或方向的任何帮助,我们将不胜感激。谢谢。

你在界面“IFooDao”上有@Transactional注释吗?

提到HibernateTemplate不再是正确的做事方式,以及@Transactional注释的建议,我提出了以下似乎有效的方法。我没有声称这是最好的或唯一的方法,但它是有效的,我想为未来的读者保留此配置的记录

请注意,使用HibernateTemplate的“旧方法”是《第二版Spring》一书中描述的方法,但这种新方法主要来自第三版

弹簧配置

<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory"><ref local="sessionFactory"/></property>
</bean>
<bean id="sessionFactory"
    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="configLocation">
    <value>WEB-INF/hibernate.cfg.xml</value>
</property>
    <property name="mappingResources">
        <list>
            <value>com/secretry/domain/Foo.hbm.xml</value>
            <value>com/secretry/domain/FooType.hbm.xml</value>
        </list>
    </property>
</bean>
<bean id="FooDao" class="com.foo.dao.FooDao" >
  <constructor-arg name="sessionFactory" ref="sessionFactory"/>
</bean>

  <tx:annotation-driven />

  <bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>

  <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory"><ref local="sessionFactory"/></property>
  </bean>
  <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
        <property name="configLocation">
        <value>WEB-INF/hibernate.cfg.xml</value>
            </property>
  <property name="packagesToScan">
    <list>
        <value>com.secretry.domain</value>
    </list>
  </property>

  <property name="mappingResources">
    <list>
    <value>com/secretry/domain/Mission.hbm.xml</value>
    <value>com/secretry/domain/MissionType.hbm.xml</value>
    <value>com/secretry/domain/Spy.hbm.xml</value>
    <value>com/secretry/domain/CompletedMission.hbm.xml</value>
    </list>
  </property>
</bean>
确保从hibernate配置文件中删除以下内容(如果有的话)

  <property name="current_session_context_class">thread</property>
线程

您是如何配置事务管理器的?您如何处理交易边界?请注意,除非要处理异常,否则不应捕获该异常。另外,hibernateTemplate也不推荐,因为我已经在问题中添加了我的Spring配置。try/catch更多的是为了我的测试,而我试图找出问题所在。我认为扩展HibernateDataSupport并使用getHibernateTemplate()是正确的。@hvgotocodes为什么不推荐hibernateTemplate?@hvgotocodes从Spring 3.0.x开始就不推荐,我不知道有任何计划不推荐它。你能告诉我们你的消息来源吗?嘿,马特。我认为这可能是其他人提到的事务配置问题。要验证这一点,请尝试删除事务管理器(只需在Spring上下文XML中删除/注释掉transactionManager bean),然后查看问题是否消失。如果是,请将其放回并尝试指定事务设置(最好是在管理器/服务层,而不是数据层)。您可以使用@Transactional或XML(如果您愿意)来实现这一点。如果你愿意的话,我可以从我过去开发的应用程序中找到一些例子(这有点让人头疼)。
@Repository
@Transactional
public class FooDao implements IFooDao {

    private SessionFactory sessionFactory;

    @Autowired
    public FooDao(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }

    public FooDao() {
    }

    private Session currentSession() {
        return sessionFactory.getCurrentSession();
    }

    @Override
    @Cacheable(cacheName="secretryCache")
    public Foo getFoo(int id) {

        return (Foo)currentSession().load(Foo.class, id);

    }
}
  <property name="current_session_context_class">thread</property>