Java 从Hibernate生成SQL脚本

Java 从Hibernate生成SQL脚本,java,sql,swing,hibernate,p6spy,Java,Sql,Swing,Hibernate,P6spy,我在Java Swing应用程序中使用Hibernate 4.3.5-Final,并使用它(在HQL或标准中)执行许多UDPATE、INSERT和DELETE) 现在,我要做的是导出一个SQL脚本,其中包含对数据库所做的所有修改,但我不知道如何做到这一点。此脚本只需要包含修改(而不是创建表),并将它们放在.sql文件中(导出的文件路径将由用户选择) 你有什么办法可以解决我的问题吗 提前谢谢你 [编辑]:一些论坛讨论p6spy,它能回答我的问题吗?p6spy应该在这里有所帮助 一般来说,以下各项应

我在Java Swing应用程序中使用Hibernate 4.3.5-Final,并使用它(在HQL或
标准中)执行许多
UDPATE
INSERT
DELETE

现在,我要做的是导出一个SQL脚本,其中包含对数据库所做的所有修改,但我不知道如何做到这一点。此脚本只需要包含修改(而不是创建表),并将它们放在
.sql
文件中(导出的文件路径将由用户选择)

你有什么办法可以解决我的问题吗

提前谢谢你


[编辑]:一些论坛讨论
p6spy
,它能回答我的问题吗?

p6spy
应该在这里有所帮助

一般来说,以下各项应为您完成此项工作:

  • 在应用程序中启用
    p6spy
    (请参阅官方文档:)
  • 之后,您基本上有两种选择:

  • 使用提供的:,通过
    spy.properties
    中的
    appender=com.p6spy.engine.spy.appender.BatchFileLogger
    启用它(但它尚未记录,请参阅:)
  • 实现自定义
    com.p6spy.engine.spy.appender.MessageFormattingStrategy
    ,该策略将仅返回sql(请参阅:了解有关实现的想法),并通过以下方式在
    spy.properties
    中对其进行配置:
    logMessageFormat=FooFormat
  • 设置
    sqlexpression
    以匹配所需的查询-限制
    CREATE/ALTER/。。。表/顺序/…
    (见正式文件:)
  • 还有一些棘手的问题,比如:

    • databasedialgendateformat
      属性(能够在不修改的情况下重放输出)。有关一些常见数据库的灵感,请参阅p6spy本身的单元测试:

    p6spy
    在这里应该有所帮助

    一般来说,以下各项应为您完成此项工作:

  • 在应用程序中启用
    p6spy
    (请参阅官方文档:)
  • 之后,您基本上有两种选择:

  • 使用提供的:,通过
    spy.properties
    中的
    appender=com.p6spy.engine.spy.appender.BatchFileLogger
    启用它(但它尚未记录,请参阅:)
  • 实现自定义
    com.p6spy.engine.spy.appender.MessageFormattingStrategy
    ,该策略将仅返回sql(请参阅:了解有关实现的想法),并通过以下方式在
    spy.properties
    中对其进行配置:
    logMessageFormat=FooFormat
  • 设置
    sqlexpression
    以匹配所需的查询-限制
    CREATE/ALTER/。。。表/顺序/…
    (见正式文件:)
  • 还有一些棘手的问题,比如:

    • databasedialgendateformat
      属性(能够在不修改的情况下重放输出)。有关一些常见数据库的灵感,请参阅p6spy本身的单元测试:

    谢谢您的帮助,所以我将尝试
    p6spy
    。另外,我忘记了一点,我的应用程序是“多方言”,这意味着我让用户在
    Oracle SQL
    mssqlserver 2005
    mssqlserver 2005
    (在登录屏幕上)之间进行选择。那么如何动态设置
    realdriver
    ?这取决于,如果您使用的是jdbc4 drivers+,那么它将使用jdbc url代理(对于Oracle,类似于:
    jdbc:p6spy:Oracle:thin:@localhost:1521:XE
    )=>根本不需要配置
    realdriver
    。但这取决于你是否使用了一些应用服务器,。。。请随意询问更多详细信息:顺便说一句。属性:
    realdriver
    已被弃用,取而代之的是:
    driverlist
    (仍有一些文档可能已经过时),因此我按照您的第二个解决方案的建议做了(我创建了一个实现
    MessageFormattingStrategy
    )的类。现在我将尝试只过滤
    UDPATE
    INSERT
    DELETE
    sqlexpression,但我认为大部分工作现在已经完成了!万分感谢!我的问题差不多解决了。我已经用
    filter=true
    sqlexpression=^(更新|插入|删除)。*$
    spy.properties
    中过滤了我的SQL
    .log
    ,但有一个小问题:值没有转义。因此,如果用户将一个字段放到
    这是一个测试'
    ,脚本将是
    更新MYTABLE set field='这是一个测试',其中id=1和它将不起作用,因为未被替换的
    。有解决方案吗?谢谢您的帮助,所以我将尝试
    p6spy
    。另外,我忘记了一点,我的应用程序是“多方言”,这意味着我让用户在
    Oracle SQL
    mssqlserver 2005
    mssqlserver 2005
    (在登录屏幕上)之间进行选择。那么如何动态设置
    realdriver
    ?这取决于,如果您使用的是jdbc4 drivers+,那么它将使用jdbc url代理(对于Oracle,类似于:
    jdbc:p6spy:Oracle:thin:@localhost:1521:XE
    )=>根本不需要配置
    realdriver
    。但这取决于你是否使用了一些应用服务器,。。。请随意询问更多详细信息:顺便说一句。属性:
    realdriver
    已被弃用,取而代之的是:
    driverlist
    (仍有一些文档可能已经过时),因此我按照您的第二个解决方案的建议做了(我创建了一个实现
    MessageFormattingStrategy
    )的类。现在我将尝试只过滤
    UDPATE
    INSERT
    DELETE
    sqlexpression,但我认为大部分工作现在已经完成了!万分感谢!我的问题差不多解决了。我已经用
    filter=true
    sqlexpression=^(更新|插入|删除)。*$
    spy.properties
    中过滤了我的SQL
    .log
    ,但有一个小问题:值没有转义。因此,如果用户将一个字段放到
    这是一个测试'
    ,脚本将是
    更新MYTABLE set field='这是一个测试',其中id=1由于unes,它将无法工作