Java 从Hibernate生成SQL脚本
我在Java Swing应用程序中使用Hibernate 4.3.5-Final,并使用它(在HQL或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应该在这里有所帮助 一般来说,以下各项应
标准中)执行许多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,它将无法工作