2010-02-24 4 views
5

validateSchema 메소드를 호출하여 org.hibernate.cfg.Configuration 객체를 사용하여 프로그래밍 방식으로 유효성 검사를 수행하는 것으로 보입니다. 그러나이 메소드에는 dialect 및 databaseMetadata 객체가 필요합니다. Spring을 사용하고 있으며 Spring 컨텍스트에서 AnnotationSessionFactoryBean 객체를 가져올 수 있습니다. 지금까지 다음 코드를 가지고 있습니다 :주석을 사용하여 최대 절전 모드에서 프로그래밍 방식으로 데이터베이스 스키마의 유효성을 검사하는 방법은 무엇입니까?

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

올바른 트랙에 있습니까? ConnectionHelper 계층 구조는 패키지 밖으로 볼 수 없으므로 databaseMetadata을 구성하기 위해 연결 객체를 이와 같이 얻을 수 없습니다. 어떻게 구현할 수 있습니까?

편집 : 나는 약간의 진전을 이뤘다고 생각한다. SchemaValidator 클래스가 있습니다. 코드는 이제 다음과 같습니다

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

Howerver을, 지금은 다음과 같은 오류가 무엇입니까 :

org.hibernate.HibernateException : 구성 찾을 수 없습니다 로컬 데이터 소스를 - '는 dataSource'속성이 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(); 
    } 
}