2 Aralık 2018 Pazar

SpringData LocalSessionFactoryBean Sınıfı - Kullanmayın

Giriş
Şu satırı dahil ederiz.
import org.springframework.orm.hibernate5.LocalSessionFactoryBean;
Bu sınıf Hibernate kütüphanesindeki SessionFactory nesnesini yaratır.
import org.hibernate.SessionFactory;
Spring + Hibernate kullanmak için şu bean'ler gerekir.
1. DataSource
2. LocalSessionFactoryBean. LocalSessionFactoryBean DataSource nenesini kullanır.
3. HibernateTransactionManager. HibernateTransactionManager bean LocalSessionFactoryBean nesnesini kullanır.
4. DataSourceTransactionManager. Bazı örneklerde HibernateTransactionManager yerine DataSourceTransactionManager kullanılıyor.

Dolayısıyla bu sınıf için en azından şu metodları çağırmak gerekiyor.
setDataSource()
setHibernateProperties()
setPackagesToScan()

Sınıfı yarattıktan sonra HibernateTransactionManager sınıfının setSessionFactory() metoduna geçmek gerekiyor.

constructor
Şöyle yaparız.
LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
setAnnotatedClasses metodu
Örnek
Şöyle yaparız.
sessionFactory.setAnnotatedClasses(Foo.class);
Örnek
XML ile Annotated sınıfları atamak için şöyle yaparız.
<bean id="hibernate5AnnotatedSessionFactory"
  class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
  <property name="dataSource" ref="dataSource"/>
  <property name="annotatedClasses">
    <list>
      <value>domain.Delivery</value>
      <value>domain.Client</value>
      <value>domain.User</value>
      <value>domain.Session</value>
    </list>
  </property>
  <property name="hibernateProperties">
    <props>
    <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop>
    <prop key="hibernate.show_sql">true</prop>
    <prop key="hibernate.hbm2ddl.auto">update</prop>
    <prop key="maxwait">10000</prop>
    <prop key="maxidle">25</prop>
    <prop key="minidle">5</prop>
    <prop key="format_sql">false</prop>
    <!--<prop key="hibernate.cache.use_query_cache">true</prop>-->
    <prop key="hibernate.cache.use_second_level_cache">true</prop>
    <prop key="hibernate.generate_statistics">true</prop>

    
    <prop key="hibernate.c3p0.acquire_increment">1</prop>
    <prop key="hibernate.c3p0.min_size">5</prop>
    <prop key="hibernate.c3p0.max_size">20</prop>
    <prop key="hibernate.c3p0.timeout">25000</prop>
    <prop key="hibernate.c3p0.max_statements">100</prop>
    <prop key="hibernate.c3p0.idle_test_period">9000</prop>
    <prop key="hibernate.c3p0.testConnectionOnCheckout">true</prop>
    <prop key="hibernate.c3p0.acquireRetryAttempts">10</prop>
    <prop key="hibernate.c3p0.validate">true</prop>
    <prop key="hibernate.c3p0.preferredTestQuery">select 1</prop>
  </props>
  </property>
</bean>
setDataSource metodu
DataSource nesnesini Hibernate yerine Spring'in yönetmesi için kullanılır.

Örnek
Şöyle yaparız.
sessionFactory.setDataSource(...);
Örnek
XML ile DataSource atamak için şöyle yaparız.
<bean id="dataSource">
.....
</bean>

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

  <property name="dataSource">
    <ref bean="dataSource"/>
  </property>
  <property name="hibernateProperties">
    ......
  </property>
  <property name="mappingResources">
    .......
  </property> 
</bean>
setHibernateProperties metodu
Örnek
XML ile atamak için şöyle yaparız.
<bean id="sessionFactory"
  class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
  <property name="dataSource" ref="dataSource"/>
  <property name="mappingResources">
    <list>
      <value>org/springframework/samples/petclinic/hibernate/petclinic.hbm.xml</value>
    </list>
  </property>
  <property name="hibernateProperties">
    <value>
      hibernate.dialect=${hibernate.dialect}
    </value>
  </property>
</bean>
Örnek
Şöyle yaparız.
sessionFactory.setHibernateProperties(...);
Örnek
Şöyle yaparız.
Properties hibernateProperties = new Properties();
hibernateProperties.put("hibernate.dialect", HIBERNATE_DIALECT);
hibernateProperties.put("hibernate.show_sql", HIBERNATE_SHOW_SQL);
hibernateProperties.put("hibernate.hbm2ddl.auto", HIBERNATE_HBM2DDL_AUTO);
sessionFactory.setHibernateProperties(hibernateProperties);
Örnek
Elimizde bir Validator bean olsun.
@Bean
public Validator validator() {
  return new LocalValidatorFactoryBean();
}
Şöyle yaparız.
Properties customValidator = new Properties();
customValidator.put("javax.persistence.validation.factory", validator());
sessionFactory.setHibernateProperties(customValidator);
setMappingResources metodu
Şöyle yaparız.
sessionFactory.setMappingResources("Model.hbm.xml");
setPackagesToScan metodu
<context:component-scan> yerine bu metodu çağırmak lazım. Açıklaması şöyle. Dolayısıyla bir sınıfın @Entity olarak işaretlenmesi işe yaramıyor
<context:component-scan/> does not recognize Hibernate/JPA annotations and hence has no effect.
Örnek
Şöyle yaparız.
sessionFactory.setPackagesToScan("*");
Örnek
Şöyle yaparız.
sessionFactory.setPackagesToScan("hibernate.packagesToScan");
Örnek
Şöyle yaparız.
sessionFactory.setPackagesToScan(new String[] { .....});
Örnek
XML ile atamak için şöyle yaparız.
<bean class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"
  id="sessionFactory_1">
  <property name="packagesToScan">
    <list>
      <value>com.hibernate.mapping</value>
    </list>
  </property>
  <property name="dataSource" ref="dataSource"/>
</bean>


Hiç yorum yok:

Yorum Gönder