2012-07-04 2 views
2

Возможно, название немного скуповально, но я хотел бы попросить вас дать совет.spring mvc hibernate надлежащий способ управления транзакциями

Теперь предположим, что я настроил мое приложение mvc spring с спящим и транзакциями. Часть конфигурации выглядит следующим образом:

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> 
    <property name="driverClass" value="oracle.jdbc.OracleDriver"/> 
    <property name="jdbcUrl" value="jdbc:oracle:thin:@127.0.0.1:1521:orcl"/> 
    <property name="user" value="xxx"/> 
    <property name="password" value="xxx"/> 
    <property name="maxPoolSize" value="10"/> 
    <property name="maxStatements" value="0"/> 
    <property name="minPoolSize" value="5"/> 
</bean> 
<!-- Session Factory Declaration --> 
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource"/> 
    <property name="configLocation" value="classpath:hibernate.cfg.xml"/> 
    <property name="packagesToScan" value="com.execon.models"/> 
</bean> 

<!-- Enable the configuration of transactional behavior based on annotations --> 
<tx:annotation-driven transaction-manager="txManager"/> 

<!-- Transaction Manager is defined --> 
<bean id="txManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> 
    <property name="sessionFactory" ref="sessionFactory"/> 
</bean> 

Поэтому в основном то, что мне нужно сделать сейчас, это просто @Autowired мой sessinFactory к классу, который будет управлять правами доступа DB?

Быстрый пример, хотя его с @Controller, я перееду его @Service:

@Resource(name = "sessionFactory") 
private SessionFactory sessionFactory; 

@RequestMapping(value = "/") 
public String getMainPage(Model model) 
{ 
    Session session = sessionFactory.getCurrentSession(); 
    session.beginTransaction(); 
    Query query = session.createQuery("from Period"); 
    List<Period> list = query.list(); 
    System.out.println(list); 
    session.getTransaction().commit(); 
    return "MainPage"; 
} 

Как вы можете видеть, что я просто пытаюсь поставить на станд список консольной отображенной класса. Он отлично работает, но мне нужен совет, как это должно управляться в более крупном проекте. Должен ли я иметь некоторый класс util, который получает сессию и начинает транзакцию? Или я должен использовать некоторые шаблоны для управления этим? Просто я не хочу писать:

Session session = sessionFactory.getCurrentSession(); 
    session.beginTransaction(); 
    // 
    //... 
    // 
    session.getTransaction().commit(); 

В каждом месте, где мне нужно подключиться к БД. Может быть, я что-то упустил или сделал это совершенно неправильно? Любая помощь будет оценена

ответ

3

Бит, который вам не хватает, - это аннотации на весенние транзакции.

@RequestMapping(value = "/") 
@Transactional 
public String getMainPage(Model model) 
{ 
    Session session = SessionFactoryUtils.openSession(sessionFactory); 
    Query query = session.createQuery("from Period"); 
    List<Period> list = query.list(); 
    System.out.println(list); 
    return "MainPage"; 
} 

Очевидно, что вы указали, что обычная вещь заключается в том, чтобы отделить материал db.

В контексте вашего файла вам потребуется:

<tx:annotation-driven transaction-manager="txManager" /> 

Примечание В этом конкретном примере вам нужно будет сделать это в файле XXX-servlet.xml контекста, потому что это то, что настройка контроллера.

Общая идея с пружиной и спящим состоянием - использовать пружину для управления транзакциями и подключениями. Использование регистраторов SessionFactoryUtil спящего сеанса как ресурса транзакции, связанного с текущим потоком.

+0

Пожалуйста, сообщите, правильно ли я прав: 1st Q: '@ Transactional' с областью класса означает, что КАЖДЫЙ метод в этом классе будет обрабатываться с правом транзакции? 2nd Q: Неправильно ли это, что я сделал, создав POJO (класс Period) '@ Transactional'? 3rd Q: is 'getSession()' из пакета 'org.springframework.orm.hibernate3', равный' openSession() 'из пакета' org.springframework.orm.hibernate4'? – kamil

+0

Q1 да .. вы можете настроить весь класс на транзакционный ... и затем уточнить его для каждого метода. Q2 не особенно ошибается. Целая точка весны заключается в использовании POJO, это не отличный стиль, чтобы сделать методы контроллера транзакционными, но для небольшого проекта, черт возьми, если вы можете его протестировать. Q3 да, это то же самое .. извините, не подобрал на имя пакета hibernate4 ... будет обновлять ответ –

Смежные вопросы