2013-02-11 22 views
6

İlkbahar 3.2 ve hazırda bekletme 4'ü kullanarak sessionFactory bean yaratmaya çalışıyorum. Bunun için aşağıdaki kodu kullandım. Ama sorun buildSessionFactory() kullanımdan kaldırıldı ve buildSessionFactory(ServiceRegistry serviceRegistry) javadoc içinde kullanılması önerilir. Ancak, ServiceRegistry nedir ve buildSessionFactory(ServiceRegistry serviceRegistry)'u nasıl kullanabileceğinizi anlayamıyorum.Spring, Hibernate ve LocalSessionFactoryBuilder ile sessionFactory yapılandırın


@Configuration 
public class AppConfig { 

    ... 


    @Bean 
    public SessionFactory sessionFactory() { 
    return new LocalSessionFactoryBuilder(dataSource()) 
     .scanPackages("com.mypackages") 
     .addProperties(hibernateProperties()) 
     
          
  
    .buildSessionFactory(); 
   

    } 
} 

cevap

9

ServiceRegistry arayüzü (yani hazırda 4 için yenidir) hizmetleri kavramı ile ilgilidir. Hizmetler, çeşitli işlevlerle Hazırda Bekletme sağlayan ve kullanıcının alternatif uygulamaları takabildiği sınıflardır. Detaylar için bkz. this wiki page. buildSessionFactory() yönteminin, buildSessionFactory(ServiceRegistry serviceRegistry) yöntemine uygun olarak Hibernate'in Configuration sınıfında kullanımdan kaldırıldığını kabul ediyorsunuz. (Bahar olmadan) saf hazırda bekletme en ortamda bunu öyle bir şekilde ServiceRegistry örneğini başlatmak olacağı varsayılır:

private static SessionFactory sessionFactory; 
private static ServiceRegistry serviceRegistry; 

private static SessionFactory configureSessionFactory() throws HibernateException { 
    Configuration configuration = new Configuration(); 
    configuration.configure(); 

    serviceRegistry = new ServiceRegistryBuilder() 
      .applySettings(configuration.getProperties()) 
      .buildServiceRegistry(); 

    sessionFactory = configuration.buildSessionFactory(serviceRegistry); 
    return sessionFactory; 
} 

Ama şimdi kaldırılan yöntem buildSessionFactory() da sizin için ServiceRegistry aynı başlatma yapar tarafından

.

Spring'in LocalSessionFactoryBuilder sınıfı, yalnızca Hibernate'in Configuration sınıfının uzantısıdır. Ancak, Spring'in tüm spesifik çalışmaları LocalSessionFactoryBuilder.buildSessionFactory() geçersiz yöntemiyle yapıldığından, Spring'in ortamında buildSessionFactory(ServiceRegistry serviceRegistry) yöntemini kullanamazsınız. Çok fazla bir şey yok çünkü tam olarak aynı işi yapan buildSessionFactory()'u kullanmak iyi. Yani sadece 4.

+0

bu cevap güncel midir? – dtrunk

+0

@dtrunk Eğer hatalı değilim eğer hala Bahar 4.0.0.RC1 için cevap hala geçerli –

0

Ayrıca zincirleme olmadan kod yazabilirsiniz @SuppressWarnings("deprecation") ile AppConfig yöntemini açıklama ve sabırla Bahar ile hazırda daha iyi entegrasyonu sağlamak için bekleyelim:

LocalSessionFactoryBuilder builder = new LocalSessionFactoryBuilder(dataSource()); 
builder.scanPackages("com.mypackages"); 
builder.addProperties(hibernateProperties()); 
return builder.buildSessionFactory(); 

Biraz daha ayrıntılı ancak kötü kokulu değil olarak @SuppressWarnings ("kullanım dışı bırakma")

0

Artem Shafranov tarafından sağlanan yanıt tamamen doğru değildir ve yaptığım gibi çok kafa karıştırıcı bir konuya girebilirsiniz.

Eğer hbm2dll bağlantı havuzu UserSuppliedConnectionProviderImpl için (ki temelde güzel yolu: null) kurulacaktır çünkü

hibernate.hbm2ddl.auto 

Başvurunuz kadar başlamayacaktır kullanın.

org.hibernate.service.UnknownUnwrapTypeException: Cannot unwrap to requested type [javax.sql.DataSource] 

Bunun nedeni hbm2dll tarafından kullanılıyor ancak Bahar ile güzel oynamıyor hangi ServiceRegistry ile ilgisi var: Bu durum göreceksiniz. Önerilen programatik oturum yapılandırma yöntemlerinin çoğunu kullanarak, hbm2dll yürütüldüğünde henüz uygun referansa sahip olmayacaktır.

benim için çalıştı tek yolu LocalSessionFactoryBuilder başarısız Kullanarak aşağıdaki

@Inject 
DataSource datasource; 

@Bean 
@SuppressWarnings("deprecation") 
public SessionFactory sessionFactory() throws IOException{ 

    LocalSessionFactoryBean sessionFactoryBean = new LocalSessionFactoryBean(); 
    sessionFactoryBean.setPackagesToScan("nl.your.model"); 
    sessionFactoryBean.setHibernateProperties(hibernateProperties()); 
    sessionFactoryBean.setDataSource(datasource); 
    sessionFactoryBean.afterPropertiesSet(); 

    return sessionFactoryBean.getObject(); 
} 

olduğunu. StandardServiceRegistryBuilder kullanarak, şaşırtıcı bir şekilde, başarısız oldu.

Gerçekten kafa karıştırıcı sorun.

İlgili konular