Hibernate / Spring откат вставки без ошибок - PullRequest
0 голосов
/ 02 февраля 2011

У меня есть 2 класса, Foo и FooType, где FooType - это всего лишь 3 строки в базе данных, представляющие 3 возможных типа.Я отображаю FooType в Hibernate, но нет ничего, кроме полей ID и описания.В файле 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>

Вот соответствующий бит моей конфигурации 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>

Я думаю, что это правильно, но если нет, пожалуйста, помогите.У меня есть FooDao, который использует HibernateDaoSupport для транзакций.

public class FoonDao extends HibernateDaoSupport implements IFooDao {

    private IFooTypeDao fooTypeDao;

    @Override
    public Foo createFoo(String name, String description, int fooTypeId) {

        FooType type = fooTypeDao.getFooType(fooTypeId);
        Foo newFoo = new Foo(name, description, type);

        try {
            getHibernateTemplate().save(newFoo);
        }
        catch(Exception e) {
            logger.error("ERROR: ", e);
            return null;
        }

        return newFoo;
    }
}

Когда я запускаю createFoo, я не вижу никаких ошибок, но в моих журналах MySQL я вижу оператор Insert, за которым сразу следует rollback.У меня включена полная регистрация для Hibernate, но я не вижу ничего, что показалось бы мне ошибкой.Когда я копирую вставку из журналов и запускаю ее в mysql вручную, она отлично работает , что, пожалуй, самая неприятная вещь.

Я новичок в Hibernate, поэтому я думаю, что этовозможно, что-то я делаю неправильно с сопоставлением «многие-к-одному», но я не могу понять это ради своей жизни.Любая помощь с проблемой или указанием на то, что я могу делать неправильно, будет очень цениться.Благодаря.

Ответы [ 2 ]

2 голосов
/ 02 февраля 2011

Есть ли у вас аннотация @Transactional на интерфейсе "IFooDao"

0 голосов
/ 08 февраля 2011

С упоминанием о том, что HibernateTemplate больше не является правильным способом ведения дел, и предложением аннотации @Transactional, я пришел к следующему, которое, похоже, работает. Я не утверждаю, что это лучший или единственный способ, но он работает, и я хочу сохранить запись этой конфигурации для будущих читателей.

Обратите внимание, что "старый способ" использования HibernateTemplate - это способ, описанный в книге "Весна в действии, 2-е издание" , но этот новый способ в основном взят из 3-го издания .

Spring config

<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>

Java-код для DAO, который я использую для получения объектов из Hibernate.

@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);

    }
}

Убедитесь, что удалили следующее из вашего конфигурационного файла hibernate, если он у вас есть

  <property name="current_session_context_class">thread</property>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...