Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring3/Hibernate-在运行时执行数据库转储_Hibernate_Spring_Mysqldump_Spring Roo_Database Dump - Fatal编程技术网

Spring3/Hibernate-在运行时执行数据库转储

Spring3/Hibernate-在运行时执行数据库转储,hibernate,spring,mysqldump,spring-roo,database-dump,Hibernate,Spring,Mysqldump,Spring Roo,Database Dump,我正在用SpringRoo开发一个应用程序,它使用Spring3和hibernate。 由于后端的构建不是高效的,所以我可以选择将数据设置回转储 如果用户提交jsp表单,则应“执行”此转储。 我可以加载Dump.sql文件,一切正常,只是不知道如何执行它。 我尝试了几种方法: 1.实体管理器的本机查询: Query q = entityManager.createNativeQuery(dump); q.executeUpdate(); 但它不起作用(hibernate例外),我认为这是因

我正在用SpringRoo开发一个应用程序,它使用Spring3和hibernate。
由于后端的构建不是高效的,所以我可以选择将数据设置回转储

如果用户提交jsp表单,则应“执行”此转储。 我可以加载Dump.sql文件,一切正常,只是不知道如何执行它。 我尝试了几种方法:
1.实体管理器的本机查询:

Query q = entityManager.createNativeQuery(dump);  
q.executeUpdate();
但它不起作用(hibernate例外),我认为这是因为hibernate无法“读取”mysql导出的Dump.sql文件“
2.方法是只使用hibernate:

Configuration cfg = new Configuration();  
File configFile = new     File(getClass().getClassLoader().getResource("/METAINF/persistence.xml").toURI());  
cfg.configure(configFile);  
SessionFactory sf=cfg.buildSessionFactory();  
Session sess=sf.openSession();  
Statement st;  
st = sess.connection().createStatement();  
但它也不起作用:

org.hibernate.MappingException:配置无效 原因:org.xml.sax.SAXParseException:文档无效:未找到语法


有什么建议吗?

我曾经写过一个Java类,它从一个数据库转储数据,然后将数据导入另一个数据库(但它不使用MySQL生成的转储)。也许您可以看看它

该类取决于和:

import java.io.IOException;
导入java.sql.SQLException;
导入javax.sql.DataSource;
导入org.apache.commons.logging.Log;
导入org.apache.commons.logging.LogFactory;
导入org.apache.ddlutils.Platform;
导入org.apache.ddlutils.PlatformFactory;
导入org.apache.ddlutils.model.Database;
导入org.dbunit.DatabaseUnitException;
导入org.dbunit.database.DatabaseConnection;
导入org.dbunit.database.IDatabaseConnection;
导入org.dbunit.dataset.IDataSet;
导入org.dbunit.operation.DatabaseOperation;
导入org.springframework.beans.factory.annotation.Autowired;
导入org.springframework.beans.factory.annotation.Qualifier;
导入org.springframework.beans.factory.annotation.Value;
导入org.springframework.context.ApplicationContext;
导入org.springframework.context.support.ClassPathXmlApplicationContext;
/**
*数据库之间的转储程序。
* 
*@author-ndevege
*/
公共最终类数据库转储程序{
/**
*洛格。
*/
私有静态最终日志记录器=LogFactory.getLog(DatabaseDumper.class);
/**
*环境(开发、持续集成等)。
*/
@值(“#{envProperties['env']}”)
私有字符串环境;
/**
*要从中转储数据的数据库。
*/
@自动连线
@限定符(“referenceDataSource”)
私有数据源;
/**
*要向其中写入数据的数据库。
*/
@自动连线
@限定符(“数据源”)
私有数据源数据源;
/**
*我们需要运行转储吗?
*/
私有布尔多伦;
/**
*@returnthedorun
*/
公共布尔值isDoRun(){
如果(多伦){
返回true;
}
//仅在持续集成环境中运行转储
if(“持续集成”。等效信号案例(env)){
返回true;
}
返回false;
}
/**
*@param aDoRun
*要设置的多伦
*/
公共无效设置域(最终布尔值域){
多伦=阿多伦;
}
/**
*如果不是由Spring初始化,则设置数据源。
*从命令行启动此实用程序时使用此方法。 * *@SQLException *论错误 */ 私有void initDataSources()引发SQLException{ if(sourceDataSource==null | | destDataSource==null){ ApplicationContext context=new ClassPathXmlApplicationContext(“spring/dbDumperContext.xml”); sourceDataSource=(DataSource)context.getBean(“referenceDataSource”); destDataSource=(DataSource)context.getBean(“DataSource”); } } /** *转储程序执行。 * *@抛出异常 *论错误 */ public void execute()引发异常{ 如果(!isDoRun()){ debug(“不要运行环境\”+env+“\”的转储); }否则{ LOGGER.warn(“警告!!!运行数据库转储,可能需要一些时间…”); 长启动=System.currentTimeMillis(); //提取模式 数据库模式=转储模式(sourceDataSource); //创建模式 createSchema(destDataSource,schema); //提取数据 IDataSet数据集=转储数据(sourceDataSource); //导入数据 导入数据(数据源、数据集); if(LOGGER.isDebugEnabled()){ LOGGER.debug(“数据库转储持续时间=”+(System.currentTimeMillis()-start)+“ms”); } } } /** *使用ddlutils提取模式。 * *@param aSourceDataSource *源数据库 *@返回包含架构的outputstream *@抛出DatabaseUnitException *论错误 *@SQLException *论错误 *@抛出异常 *论错误 */ 私有IDataSet dumpData(最终数据源aSourceDataSource)抛出DatabaseUnitException、SQLException、, IOException{ IDatabaseConnection sourceConnection=新数据库连接(aSourceDataSource.getConnection()); 返回sourceConnection.createDataSet(); } /** *使用dbUnit提取数据。 * *@param aSourceDataSource *源数据库 *@返回包含数据的outputstream */ 专用数据库转储模式(最终数据源aSourceDataSource){ 返回PlatformFactory.createNewPlatformInstance(aSourceDataSource.readModelFromDatabase(“sourceModel”); } /** *在目标数据库中创建架构。 * *@param aDestDataSource *目标数据库 *@param模式 *模式 */ 私有void createSchema(最终数据源aDestDataSource,最终数据库架构){ 平台destformplatform=PlatformFactory.createNewPlatformInsta
import java.io.IOException;
import java.sql.SQLException;

import javax.sql.DataSource;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.ddlutils.Platform;
import org.apache.ddlutils.PlatformFactory;
import org.apache.ddlutils.model.Database;
import org.dbunit.DatabaseUnitException;
import org.dbunit.database.DatabaseConnection;
import org.dbunit.database.IDatabaseConnection;
import org.dbunit.dataset.IDataSet;
import org.dbunit.operation.DatabaseOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * Dumper between databases.
 * 
 * @author ndeverge
 */
public final class DatabaseDumper {

    /**
     * Le logger.
     */
    private static final Log LOGGER = LogFactory.getLog(DatabaseDumper.class);

    /**
     * Environment (dev, continuous integration etc...).
     */
    @Value("#{envProperties['env']}")
    private String env;

    /**
     * The db to dump data from.
     */
    @Autowired
    @Qualifier("referenceDataSource")
    private DataSource sourceDataSource;

    /**
     * the db where to write data to.
     */
    @Autowired
    @Qualifier("dataSource")
    private DataSource destDataSource;

    /**
     * Do we need to run the dump ?
     */
    private boolean doRun;

    /**
     * @return the doRun
     */
    public boolean isDoRun() {
        if (doRun) {
            return true;
        }
        // run the dump only on continuous-integration environment
        if ("continuous-integration".equalsIgnoreCase(env)) {
            return true;
        }
        return false;
    }

    /**
     * @param aDoRun
     *            the doRun to set
     */
    public void setDoRun(final boolean aDoRun) {
        doRun = aDoRun;
    }

    /**
     * Set datasources if not initialized by Spring.<br>
     * This method is used when this utility is started from command line.
     * 
     * @throws SQLException
     *             on errors
     */
    private void initDataSources() throws SQLException {

        if (sourceDataSource == null || destDataSource == null) {
            ApplicationContext context = new ClassPathXmlApplicationContext("spring/dbDumperContext.xml");

            sourceDataSource = (DataSource) context.getBean("referenceDataSource");

            destDataSource = (DataSource) context.getBean("dataSource");
        }

    }

    /**
     * Dumper execution.
     * 
     * @throws Exception
     *             on errors
     */
    public void execute() throws Exception {

        if (!isDoRun()) {
            LOGGER.debug("Do not run the dump for environment \"" + env + "\"");
        } else {

            LOGGER.warn("WARNING !!! Running the database dump, it may take some time...");

            long start = System.currentTimeMillis();

            // extract schema
            Database schema = dumpSchema(sourceDataSource);

            // create schema
            createSchema(destDataSource, schema);

            // extract data
            IDataSet dataSet = dumpData(sourceDataSource);

            // import data
            importData(destDataSource, dataSet);

            if (LOGGER.isDebugEnabled()) {
                LOGGER.debug("Database dump duration = " + (System.currentTimeMillis() - start) + " ms");
            }
        }
    }

    /**
     * Extract schema using ddlutils.
     * 
     * @param aSourceDataSource
     *            source db
     * @return an outputstream containing the schema
     * @throws DatabaseUnitException
     *             on errors
     * @throws SQLException
     *             on errors
     * @throws IOException
     *             on errors
     */
    private IDataSet dumpData(final DataSource aSourceDataSource) throws DatabaseUnitException, SQLException,
            IOException {
        IDatabaseConnection sourceConnection = new DatabaseConnection(aSourceDataSource.getConnection());

        return sourceConnection.createDataSet();
    }

    /**
     * Extract data using dbUnit.
     * 
     * @param aSourceDataSource
     *            source db
     * @return an outputstream containing the data
     */
    private Database dumpSchema(final DataSource aSourceDataSource) {
        return PlatformFactory.createNewPlatformInstance(aSourceDataSource).readModelFromDatabase("sourceModel");

    }

    /**
     * Create schema in destination db.
     * 
     * @param aDestDataSource
     *            the destination db
     * @param schema
     *            the schema
     */
    private void createSchema(final DataSource aDestDataSource, final Database schema) {
        Platform destPlatform = PlatformFactory.createNewPlatformInstance(aDestDataSource);

        // create schema by droping tables firts (2nd parameter = true)
        destPlatform.createTables(schema, true, true);
    }

    /**
     * Data import.
     * 
     * @param aDestDataSource
     *            the destination db
     * @param dataSet
     *            the data
     * @throws SQLException
     *             on errors
     * @throws DatabaseUnitException
     *             on errors
     */
    private void importData(final DataSource aDestDataSource, final IDataSet dataSet) throws DatabaseUnitException,
            SQLException {
        IDatabaseConnection destConnection = new DatabaseConnection(aDestDataSource.getConnection());

        DatabaseOperation.CLEAN_INSERT.execute(destConnection, dataSet);
    }

    /**
     * Launch the dumper from commande line.
     * 
     * @param args
     *            paramètres
     */
    public static void main(final String[] args) {
        try {
            DatabaseDumper dumper = new DatabaseDumper();
            dumper.setDoRun(true);
            dumper.initDataSources();
            dumper.execute();
        } catch (Exception e) {
            LOGGER.error("", e);
        }
    }

}