2010-02-24 10 views
5

ऐसा लगता है कि org.hibernate.cfg.Configuration ऑब्जेक्ट को वैधता स्कैमा विधि को कॉल करके प्रोग्रामेटिक रूप से सत्यापन करने के लिए उपयोग किया जा सकता है। हालांकि, इस विधि को बोली और डेटाबेस मेटाडेटा ऑब्जेक्ट्स की आवश्यकता है। मैं वसंत का उपयोग कर रहा हूं और मैं वसंत संदर्भ से एनोटेशन सत्र FactoryBean वस्तु पकड़ सकता है। अब तक मेरे पास निम्न कोड है:एनोटेशन के साथ हाइबरनेट में डेटाबेस स्कीमा को प्रोग्रामेटिक रूप से कैसे सत्यापित करें?

AnnotationSessionFactoryBean factory = null; 
    factory = (AnnotationSessionFactoryBean) context.getBean("AnnotationSessionFactory"); 
    Configuration configuration = factory.getConfiguration(); 

    //the following line does not work, ConnectionHelper hierarchy is not visible outside the package 
    ConnectionHelper connectionHelper = 
    new ManagedConnectionProviderConnectionHelper(factory.getHibernateProperties()); 

    Dialect dialect = Dialect.getDialect(factory.getHibernateProperties()); 
    Connection connection = null; 
    DatabaseMetadata databaseMetadata = null; 
    try { 
     databaseMetadata = new DatabaseMetadata(connection, dialect); 
    } catch (SQLException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    configuration.validateSchema(dialect, databaseMetadata); 

क्या मैं सही रास्ते पर हूं? कनेक्शन हेल्पर पदानुक्रम पैकेज से बाहर दिखाई नहीं दे रहा है, इसलिए मैं डेटाबेस मेटाडेटा बनाने के लिए कनेक्शन ऑब्जेक्ट को इस तरह से प्राप्त नहीं कर सकता। मैं इसे कैसे कार्यान्वित कर सकता हूं?

संपादित करें: मुझे लगता है कि मैंने कुछ प्रगति की है। एक स्कीमाविलिएटर वर्ग है। कोड अब इस तरह दिखता है:

AnnotationSessionFactoryBean factory = context.getBean("&AnnotationSessionFactory"); 
Configuration configuration = factory.getConfiguration();  
SchemaValidator validator = new SchemaValidator(configuration); 
validator.validate();  

Howerver, अब मैं निम्न त्रुटि हो रही है:

org.hibernate.HibernateException: नहीं स्थानीय डेटा स्रोत विन्यास के लिए मिला - 'डेटा स्रोत' संपत्ति LocalSessionFactoryBean पर सेट किया जाना चाहिए

उत्तर

4

अंत में, वसंत का उपयोग करते समय यह इतना आसान नहीं है। LocalSessionFactoryBean.validateDatabaseSchema() (जो प्रभावी रूप से के रूप में एक ही बात करता है:

public class SchemaValidatingAnnotationSessionFactoryBean extends 
    AnnotationSessionFactoryBean { 

public void validateDatabaseSchema() throws DataAccessException { 
    logger.info("Validating database schema for Hibernate SessionFactory"); 
    HibernateTemplate hibernateTemplate = new HibernateTemplate(
      getSessionFactory()); 
    hibernateTemplate.setFlushMode(HibernateTemplate.FLUSH_NEVER); 
    hibernateTemplate.execute(new HibernateCallback() { 
     public Object doInHibernate(Session session) 
       throws HibernateException, SQLException { 
      Connection con = session.connection(); 
      Dialect dialect = Dialect.getDialect(getConfiguration() 
        .getProperties()); 
      DatabaseMetadata metadata = new DatabaseMetadata(con, dialect); 
      Configuration configuration = getConfiguration(); 
      configuration.validateSchema(dialect, metadata); 
      return null; 
     } 
    }); 

} 
} 
1

मुझे लगता है कि मेरे लिए काम करता लागू हाइबरनेट मानचित्रण सत्यापन के लिए एक सरल समाधान मिल गया है: मैं इसे इस तरह AnnotationSessionFactoryBean का विस्तार करने के लिए प्रबंधित उपरोक्त दान के उत्तर में कोड)

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = { "/some-test-context.xml" }) 
public class TestMapping { 

    @Autowired 
    ApplicationContext context; 

    @Test 
    public void validateSchema() { 
     AnnotationSessionFactoryBean factory = (AnnotationSessionFactoryBean)context 
       .getBean("&mySessionFactory"); 
     factory.validateDatabaseSchema(); 
    } 
} 
संबंधित मुद्दे