2013-02-11 26 views
6

मैं वसंत 3.2 का उपयोग कर sessionFactory सेम बना सकते हैं और हाइबरनेट 4. मैं उस के लिए निम्न कोड का इस्तेमाल किया करने के लिए कोशिश कर रहा हूँ। लेकिन समस्या buildSessionFactory() को हटा दिया गया है और buildSessionFactory(ServiceRegistry serviceRegistry) को जवाडोक में उपयोग करने के लिए सुझाव दिया गया है। हालांकि, मैं समझने की ServiceRegistry और कैसे buildSessionFactory(ServiceRegistry serviceRegistry) उपयोग करने के लिए है कि क्या में सक्षम नहीं होने रहा हूँ।कॉन्फ़िगर sessionFactory और LocalSessionFactoryBuilder


@Configuration 
public class AppConfig { 

    ... 


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

    } 
} 

उत्तर

9

ServiceRegistry इंटरफेस सेवाओं की अवधारणा से संबंधित है (कि हाइबरनेट 4 के लिए नया है)। सेवाएं कक्षाएं हैं जो विभिन्न कार्यक्षमताओं के साथ हाइबरनेट प्रदान करती हैं और जिसके लिए उपयोगकर्ता वैकल्पिक कार्यान्वयन में प्लग कर सकते हैं। विवरण के लिए this wiki page देखें।

आप सही हैं कि विधि buildSessionFactory() विधि buildSessionFactory(ServiceRegistry serviceRegistry) विधि के पक्ष में हाइबरनेट के Configuration कक्षा में बहिष्कृत है। (स्प्रिंग) के बिना एक शुद्ध हाइबरनेट के माहौल को देखते यह माना जाता है कि आप इस तरह से ServiceRegistry के कहने प्रारंभ हो जाएगा:

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; 
} 

लेकिन अब पदावनत विधि buildSessionFactory() भी आप के लिए ServiceRegistry का एक ही प्रारंभ करता है के द्वारा।

वसंत की LocalSessionFactoryBuilder कक्षा केवल हाइबरनेट के Configuration कक्षा का विस्तार है। लेकिन चूंकि स्प्रिंग के सभी विशिष्ट कार्य ओवर्रिडेन विधि LocalSessionFactoryBuilder.buildSessionFactory() में किए जाते हैं, इसलिए आप स्प्रिंग के पर्यावरण में विधि buildSessionFactory(ServiceRegistry serviceRegistry) का उपयोग नहीं कर सकते हैं। क्योंकि यह buildSessionFactory() कि ठीक उसी काम करता है का उपयोग करने के ठीक है ज्यादा कुछ भी नहीं। तो चलो बस @SuppressWarnings("deprecation") साथ AppConfig में विधि व्याख्या और धैर्यपूर्वक स्प्रिंग हाइबरनेट के साथ बेहतर एकीकरण प्रदान करने के लिए के लिए प्रतीक्षा 4.

+0

क्या यह उत्तर अद्यतित है? – dtrunk

+0

@dtrunk अगर मुझे गलत जवाब नहीं है तो वसंत 4.0.0 के लिए भी वास्तविक है। आरसी 1 –

0

तुम भी चेनिंग बिना कोड लिख सकते हैं:

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

थोड़ा अधिक वर्बोज़ लेकिन जैसा कि बदबूदार नहीं @SuppressWarnings ("बहिष्करण")

0

आर्टिम शाफ्रानोव द्वारा प्रदान किया गया उत्तर पूरी तरह से सही नहीं है और जैसा कि मैंने किया था, आप एक बहुत भ्रमित मुद्दे में भाग सकते हैं।

आप का उपयोग करते हैं

hibernate.hbm2ddl.auto 

आपके आवेदन शुरू नहीं करेगा क्योंकि hbm2dll में कनेक्शन पूल (मूल रूप से एक अच्छा तरीका कहने के लिए: नल) UserSuppliedConnectionProviderImpl करने के लिए सेट कर दिया जाएगा।

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

इस का कारण यह ServiceRegistry जो hbm2dll द्वारा प्रयोग किया जाता है लेकिन वसंत के साथ अच्छा नहीं चलता है जो के साथ क्या करना है: आप इस अपवाद देखेंगे। सुझाव कार्यक्रम संबंधी सत्र विन्यास तरीकों में से कई का उपयोग करते हुए यह अभी तक जब hbm2dll निष्पादित किया जाता है उचित संदर्भ नहीं होगा।

एक ही तरीका है कि मेरे लिए काम किया निम्नलिखित

@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(); 
} 

LocalSessionFactoryBuilder में विफल रहा है का उपयोग करना है। StandardServiceRegistryBuilder का उपयोग करके, आश्चर्यजनक रूप से, असफल भी।

सच भ्रामक मुद्दा।