Возможно, название немного скуповально, но я хотел бы попросить вас дать совет.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();
В каждом месте, где мне нужно подключиться к БД. Может быть, я что-то упустил или сделал это совершенно неправильно? Любая помощь будет оценена
Пожалуйста, сообщите, правильно ли я прав: 1st Q: '@ Transactional' с областью класса означает, что КАЖДЫЙ метод в этом классе будет обрабатываться с правом транзакции? 2nd Q: Неправильно ли это, что я сделал, создав POJO (класс Period) '@ Transactional'? 3rd Q: is 'getSession()' из пакета 'org.springframework.orm.hibernate3', равный' openSession() 'из пакета' org.springframework.orm.hibernate4'? – kamil
Q1 да .. вы можете настроить весь класс на транзакционный ... и затем уточнить его для каждого метода. Q2 не особенно ошибается. Целая точка весны заключается в использовании POJO, это не отличный стиль, чтобы сделать методы контроллера транзакционными, но для небольшого проекта, черт возьми, если вы можете его протестировать. Q3 да, это то же самое .. извините, не подобрал на имя пакета hibernate4 ... будет обновлять ответ –