powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring, Hibernate. Как лучше совместно использовать sessionFactory?
4 сообщений из 4, страница 1 из 1
Spring, Hibernate. Как лучше совместно использовать sessionFactory?
    #33405712
Alexey Turn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для spring-а можно сделать синглтон:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans  PUBLIC  "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>

<bean id="sessionFactory"  class ="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

<property name="mappingResources">
<list>
<value>/entities/test/Client.hbm.xml</value>
</list>
</property>

<property name="hibernateProperties">

<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
</props>

</property>

<property name="dataSource">
<ref bean="testDataSource"/>
</property>
</bean>

</beans>

Есть простой класс Client.

class Client {
private Integer id;
private String name;
}

Допустим, что клиент может создать дневник:

class Client {
private Integer id;
private String name;

public Journal createJournal(){
Journal j = new Journal();
session....
}
}

Вопрос: где взять session?

3. Варианта:

(1) Использовать класс HibernateUtil:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
 public   class  HibernateUtil {
 private   static  Log log = LogFactory.getLog(HibernateUtil. class );
 private   static   final  SessionFactory sessionFactory;
 static  {
 try  {
// Create the SessionFactory
sessionFactory =  new  Configuration().configure().buildSessionFactory();
}  catch  (Throwable ex) {
// Make sure you log the exception, as it might be swallowed
log.error("Initial SessionFactory creation failed.", ex);
 throw   new  ExceptionInInitializerError(ex);
}
}
 public   static   final  ThreadLocal session =  new  ThreadLocal();
 public   static  Session currentSession() {
Session s = (Session) session.get();
// Open a new Session, if this Thread has none yet
 if  (s ==  null ) {
s = sessionFactory.openSession();
session.set(s);
}
 return  s;
}
 public   static   void  closeSession() {
Session s = (Session) session.get();
 if  (s !=  null )
s.close();
session.set( null );
}
}

(2) Использовать Spring Injection в клиента для SessionFactory,
и сделать клиента прототипом.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
 class  Client {
    private  Integer id;
    private  String name;
    private  SessionFactory sessionFactory;
    public  Journal createJournal(){
     Journal j =  new  Journal();
     session....   
   }
}

Подход (1) с использованием класса HibernateUtil работает всегда.

Если мы захотим вытащить всех клиентов, не имеющих Journal и вызвать для каждого метод createJournal, подход (2) не будет работать по причине NullPointerException.

(3) Можно использовать класс ClientService в который будет Injected SessionFactory и который будет иметь метод:
createJournalForClient(Client client);

Здесь все хорошо, но хочется (видится более правильным и логичным) вызывать метод createJournal у объекта client.

Так же хочется иметь service классы в которых можно делать нечто другое. И в них действительно удобно использовать Dependency Injection от Spring -а.

Вобщем вопрос тем, кто использует Spring и Hibernate? как лучше организовать доступ к SessionFactory из слоя service и из слоя dao.
...
Рейтинг: 0 / 0
Spring, Hibernate. Как лучше совместно использовать sessionFactory?
    #33405876
Alexey Turn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hibernate 3.0.1 introduced a feature called "contextual Sessions", where Hibernate itself manages one current
Session per transaction. This is roughly equivalent to Spring's synchronization of one Hibernate Session per
transaction. A corresponding DAO implementation looks like as follows, based on plain Hibernate API:

public class ProductDaoImpl implements ProductDao {
private SessionFactory sessionFactory;
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
public Collection loadProductsByCategory(String category) {
return this.sessionFactory.getCurrentSession()
.createQuery("from test.Product product where product.category=?")
.setParameter(0, category)
.list();
}
}
This Hibernate access style is very similar to what you will find in the Hibernate documentation and examples,
except for holding the SessionFactory in an instance variable. We strongly recommend such an instance-based
setup over the old-school static HibernateUtil class from Hibernate's CaveatEmptor sample application! (In
general, do not keep any resources in static variables unless absolutely necessary!)

Это кусок из spring_reference 1.2.5
Кому нетрудно, может прокомментировать этот текст, всвязи с первым постом.
Про feature called "contextual Sessions" - не понял. Понял лишь то, что они против хранения SessionFactory в static переменной класса HibernateUtil.
...
Рейтинг: 0 / 0
Spring, Hibernate. Как лучше совместно использовать sessionFactory?
    #33407418
Alexey Turn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нашел подобный топик. Там более четко сформулирован мой вопрос.

http://forum.springframework.org/showthread.php?t=9846
...
Рейтинг: 0 / 0
Spring, Hibernate. Как лучше совместно использовать sessionFactory?
    #33408453
Alexey Turn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кому интересно, вот решение:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
<bean id="dependencyInjectionInterceptor"  class ="org.springframework.orm.hibernate.support.DependencyInjectionInterceptorFactoryBean">
    <property name="sessionFactoryName">
        <value>sessionFactory</value>
    </property>
    <property name="defaultAutowireMode">
        <value> 0 </value>
    </property>
    <property name="managedClassNamesToPrototypeNames">
        <props>
            <prop key="com.thatone.archie.engine.task.MoveTask">moveTask</prop>
            <prop key="com.thatone.archie.engine.task.DeleteTask">deleteTask</prop>
            <prop key="com.thatone.archie.engine.task.CopyTask">copyTask</prop>
            <prop key="com.thatone.archie.persistence.ArchieDataSourceImpl">archieDataSource</prop>
            <prop key="com.thatone.archie.engine.job.QuartzJobImpl">archieJob</prop>
        </props>
    </property>
</bean>
<bean id="sessionFactory"
     class ="org.springframework.orm.hibernate.LocalSessionFactoryBean" lazy-init="true">
    <property name="dataSource">
        <ref local="wrappedAppDataSource"/>
    </property>
    <property name="mappingResources">
        <list>
            <value>hbm/ApplicationModel.hbm.xml</value>
            <value>hbm/ArchieWorkflow.hbm.xml</value>
            <value>hbm/Datasource.hbm.xml</value>
            <value>hbm/Job.hbm.xml</value>
            <value>hbm/Signature.hbm.xml</value>
            <value>hbm/Task.hbm.xml</value>
            <value>hbm/Context.hbm.xml</value>
            <value>hbm/workflow/HibernateCurrentStep.hbm.xml</value>
            <value>hbm/workflow/HibernateHistoryStep.hbm.xml</value>
            <value>hbm/workflow/HibernateWorkflowEntry.hbm.xml</value>
            <value>hbm/workflow/PropertySetItemImpl.hbm.xml</value>
        </list>
    </property>
    <property name="hibernateProperties">
        <ref local="hibernateProperties"/>
    </property>
    <property name="entityInterceptor">
        <ref local="dependencyInjectionInterceptor"/>
    </property>
    <property name="jtaTransactionManager">
        <ref local="jotm"/>
    </property>
</bean>

Все нужные файлы находятся пока в песочнице на CSV сервере.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring, Hibernate. Как лучше совместно использовать sessionFactory?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]