Java 弹簧&x27;s ScriptUtils忽略转储中包含注释的代码

Java 弹簧&x27;s ScriptUtils忽略转储中包含注释的代码,java,mysql,spring,mariadb,spring-jdbc,Java,Mysql,Spring,Mariadb,Spring Jdbc,我正在尝试为单元测试创建一个MariaDB数据库,并希望使用Spring的ScriptUtils执行包含表和测试数据转储的SQL文件。当我使用HeidiSQL创建转储时,它会将包含注释的代码插入到生成的sql文件中,如下所示,以在加载转储时禁用外键检查: /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; 当我通过HeidiSQL执行转储脚本时,一切都很顺利。但在Java中使用以

我正在尝试为单元测试创建一个MariaDB数据库,并希望使用Spring的
ScriptUtils
执行包含表和测试数据转储的SQL文件。当我使用HeidiSQL创建转储时,它会将包含注释的代码插入到生成的sql文件中,如下所示,以在加载转储时禁用外键检查:

/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
当我通过HeidiSQL执行转储脚本时,一切都很顺利。但在Java中使用以下函数:

@BeforeClass
public static void initializeForTest() throws Exception {
    context = new ClassPathXmlApplicationContext("Beans.xml");
    dsRoot = (DataSource) context.getBean("dataSourceRoot");
    ScriptUtils.executeSqlScript(dsRoot.getConnection(), new ClassPathResource("DROP_AND_CREATE_DATABASE.sql"));            
}
由于外键约束失败,导致引发异常,因为转储创建了一些表,其中包含对仍需创建的表的外键引用。例如:

CREATE TABLE `cities` (
  `postal_code` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
  `country_alpha2` varchar(2) COLLATE utf8_unicode_ci NOT NULL,
  `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`postal_code`,`country_alpha2`),
  KEY `country_alpha2` (`country_alpha2`),
  CONSTRAINT `cities_ibfk_1` FOREIGN KEY (`country_alpha2`) REFERENCES `countries` (`alpha2`)
);

/* ... */

CREATE TABLE `countries` (
  `code` int(3) NOT NULL,
  `alpha2` varchar(2) COLLATE utf8_unicode_ci DEFAULT NULL,
  `alpha3` varchar(3) COLLATE utf8_unicode_ci DEFAULT NULL,
  `langCS` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL,
  `langDE` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL,
  `langEN` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL,
  `langES` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL,
  `langFR` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL,
  `langIT` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL,
  `langNL` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`code`),
  UNIQUE KEY `alpha2` (`alpha2`),
  UNIQUE KEY `alpha3` (`alpha3`)
);

我可以在不忽略包含注释的代码的情况下执行脚本吗?

ScriptUtils JavaDoc最有用的JavaDoc是

splitSqlScript(
      EncodedResource resource,
      String script,
      String separator,
      String commentPrefix,
      String blockCommentStartDelimiter,
      String blockCommentEndDelimiter,
      List<String> statements)` method, because it explains the meaning of the parameters:
提示您不能禁用块注释删除功能,但可以将其配置为使用其他块注释分隔符: 因此,我认为诀窍是使用一个不同或根本不发生的
blockCommentStartDelimiter

ScriptUtils.executeSqlScript(
    dsRoot.getConnection(), //Connection connection,
    new EncodedResource(new ClassPathResource("DROP_AND_CREATE_DATABASE.sql")), //EncodedResource resource,
    false,      //boolean continueOnError,
    false,      //boolean ignoreFailedDrops,
    "--",       //String commentPrefix,
    ";",        //String separator,
    "##/*",     //String blockCommentStartDelimiter,
    "*/##");    //String blockCommentEndDelimiter)


顺便说一句:其他解决方法:改为通过查找和替换更改所有注释:添加
set foreign\u key\u checks=0
设置外键检查=1结尾。

最近,当我们在由ScriptUtils执行的SQL查询中使用Oracle提示时,我们遇到了类似的问题

如上所述,使用“伪”分隔符解决了这个问题,但这似乎是一个应该在ScriptUtils中解决的问题

我在这张票上开了一张JIRA票

谢谢

ScriptUtils.executeSqlScript(
    dsRoot.getConnection(), //Connection connection,
    new EncodedResource(new ClassPathResource("DROP_AND_CREATE_DATABASE.sql")), //EncodedResource resource,
    false,      //boolean continueOnError,
    false,      //boolean ignoreFailedDrops,
    "--",       //String commentPrefix,
    ";",        //String separator,
    "##/*",     //String blockCommentStartDelimiter,
    "*/##");    //String blockCommentEndDelimiter)