我正在尝试在我的应用程序中使用 SchemaExport 在应用程序启动时创建数据库架构。我正在使用 Spring 3.2,并且在我的 Spring 配置文件中已经定义了一个 SessionFactory bean。
我正在尝试按如下方式使用它:
@Autowired
private LocalSessionFactoryBean session;
@Override
public void buildTable() throws Exception {
SchemaExport export = new SchemaExport(session.getConfiguration());
export.setDelimiter(";");
export.execute(false, true, false, true);
}
我的 LocalSessionFactoryBean 在我的 spring 配置文件中定义为:
<!-- application datasource -->
<bean id="dataSource.jndi" class="org.springframework.jndi.JndiObjectFactoryBean" scope="singleton">
<property name="jndiName" value="java:comp/env/jdbc/db" />
</bean>
<!-- hibernate session -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean" scope="singleton">
<property name="dataSource" ref="dataSource.jndi" />
<property name="configLocation" value="classpath:domain/hibernate/hibernate.cfg.xml" />
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop>
</props>
</property>
</bean>
但是,当我尝试运行该方法时,出现以下错误:
org.hibernate.HibernateException: No local DataSource found for configuration - 'dataSource' property must be set on LocalSessionFactoryBean
at org.springframework.orm.hibernate3.LocalDataSourceConnectionProvider.configure(LocalDataSourceConnectionProvider.java:51)
at org.hibernate.connection.ConnectionProviderFactory.newConnectionProvider(ConnectionProviderFactory.java:143)
at org.hibernate.connection.ConnectionProviderFactory.newConnectionProvider(ConnectionProviderFactory.java:84)
at org.hibernate.tool.hbm2ddl.ManagedProviderConnectionHelper.prepare(ManagedProviderConnectionHelper.java:51)
at org.hibernate.tool.hbm2ddl.SchemaExport.execute(SchemaExport.java:263)
我试图追踪问题,似乎当 SchemaExport 尝试将模式写入数据库时,它会创建一个新的 LocalSessionFactory:
来自 org.hibernate.connection.ConnectionProviderFactory (为清楚起见进行了编辑):
private static ConnectionProvider initializeConnectionProviderFromConfig(String providerClass) {
ConnectionProvider connections;
connections = (ConnectionProvider) ReflectHelper.classForName( providerClass ).newInstance();
return connections;
}
其中 providerClass = org.springframework.orm.hibernate3.LocalDataSourceConnectionProvider
因此,它不使用我的 SessionFactory bean 中定义的现有 ConnectionProvider,而是尝试创建一个新的。
如何在 SchemaExport 中使用现有的 Spring 配置的 SessionFactory / ConnectionProvider / Hibernate Configuration 对象?为了在我的应用程序中使用它,我还需要做些什么来设置/配置 SchemaExport 吗?