从Hibernate生成SQL脚本

3
我正在使用Hibernate 4.3.5-Final开发Java Swing应用程序,我使用HQL或Criteria执行许多UPDATE、INSERT和DELETE操作。现在,我想导出一个SQL脚本,该脚本仅包含对数据库的修改(而不是表的创建),并将其放入.sql文件中(导出文件路径将由用户选择)。您有任何解决我的问题的想法吗?事先感谢![编辑]:一些论坛讨论p6spy,它可以解决我的问题吗?
1个回答

4

p6spy可以帮助你。

一般来说,以下步骤可以帮助你完成工作:

  1. 在你的应用程序中启用p6spy(请参阅官方文档:http://p6spy.github.io/p6spy/

之后,你基本上有两个选择:

  1. 使用提供的BatchFileLogger,通过在spy.properties中启用它:appender=com.p6spy.engine.spy.appender.BatchFileLogger(但目前尚未记录文档,参见:https://github.com/p6spy/p6spy/issues/119

或者

  1. 实现自定义的com.p6spy.engine.spy.appender.MessageFormattingStrategy,该策略将只返回sql(请参见:https://dev59.com/IXTYa4cB1Zd3GeqPyL_c#23521623以获取实现的想法),并通过spy.properties进行配置:logMessageFormat=FooFormat
  2. sqlexpression设置为与你需要的查询匹配-限制CREATE/ALTER/... TABLE/SEQUENCE/...(请参阅官方文档:http://p6spy.github.io/p6spy/2.0/configandusage.html

仍然有一些棘手的问题,例如:


谢谢您的帮助,我将尝试使用p6spy。另外,我忘记了一个要点,我的应用程序是“多方言”的,这意味着我让用户在登录屏幕上选择Oracle SQLMS SQL Server 2005MS SQL Server 2005。那么我该如何动态设置realdriver - Florentin Le Moal
好的,这要看情况而定。如果您正在使用jdbc4驱动程序并且将使用jdbc url代理(对于Oracle,类似于:jdbc:p6spy:oracle:thin:@localhost:1521:XE),则根本不需要配置“realdriver”。但这仍然取决于您是否使用某些应用服务器,...欢迎在https://groups.google.com/forum/#!forum/p6spy-users上询问更多详细信息。 - Peter Butkovic
顺便提一下,realdriver 属性已被弃用,建议使用 driverlist(但仍有一些文档可能已过时)。 - Peter Butkovic
1
我按照你建议的第二种解决方案去做了(我创建了一个实现MessageFormattingStrategy的类)。现在我将尝试仅过滤UDPATEINSERTDELETE sqlexpression,但我认为现在大部分工作已经完成了!非常感谢你! - Florentin Le Moal
1
我快解决我的问题了。我已经在spy.properties中使用了filter=truesqlexpression=^(update|insert|delete).*$过滤了我的SQL.log,但是有一个小问题:值没有被转义。因此,如果用户将字段设置为This is a test',则脚本将变为update MYTABLE set field='This is a test'' where id=1;,由于未转义的'而无法正常工作。是否有解决方案? - Florentin Le Moal
似乎是p6spy中的一个bug。请提交一个新问题,因为相关测试尚未考虑到这种情况:https://github.com/p6spy/p6spy/blob/master/src/test/java/com/p6spy/engine/spy/LoggedSQLValidTest.java - Peter Butkovic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接