Hibernate DDL 表动态创建
Posted
技术标签:
【中文标题】Hibernate DDL 表动态创建【英文标题】:Hibernate DDL table Dynamic creation 【发布时间】:2014-12-09 15:09:10 【问题描述】:我有一个 spring boot 项目,我正在使用 hibernate 将我的实体映射到 DB,但是现在我有一个新要求:我需要能够在 DB 中动态创建表,而无需任何映射(到目前为止)。
有谁知道一些框架,以帮助我处理这个问题: -我想执行 SQL 或类似的(ddl)来创建我的表 -我需要处理连接管理
有人告诉我有关 spring-data,但我需要对此提出一些意见。
一个例子: 想象一下,我有一个可供客户使用的服务,例如:
class DBHACKService
void executeSQL(String ddl).
客户端这样调用:
new DBHackService.executeSQL ("create table mytable (name varchar)");
在这种方法中,我可以对 sql 进行一些操作。 问题是:将其发送到 DBEngine 的最佳方式是什么。
再次感谢
提前致谢。 瑞
【问题讨论】:
您好,您的问题是我很想实现同样的目标。我看没有人真的回答你。你有没有在某个地方得到答案? 【参考方案1】:你希望对作为参数传递的 sql 做什么。
如果您希望验证 sql,一种选择是触发查询,如果您遇到异常 这意味着传递的参数存在一些问题。
如果你想解析 sql 查询,那么你可以使用 jSqlParser。 http://jsqlparser.sourceforge.net/
【讨论】:
嗨。感谢回复。我想要的是在运行时创建和更改表。不实际验证 SQL。我想在运行时创建、更改、删除表。 对于创建/更改,您可以使用 DdlUtils。您可以从数据库中读取模型,然后从那里对模型进行更改,然后将更改写入数据库。我不确定删除情况,但在最坏的情况下,您可以使用 DROP 语句。【参考方案2】:您可以查看DdlUtils,您可以在其中随时提供运行时所需的更改并将您的更改反映在数据库中。该格式与数据库无关,因此您不必自己担心可移植性。
我不知道它是最新的。
如果你喜欢Groovy。
【讨论】:
【参考方案3】:查看database initialization 上的 Spring Boot 文档。
最简单的选择是将schema.sql
文件放在类路径的根目录中(例如src/main/resources
)。此文件中的任何 DDL 都将作为应用程序启动的一部分运行。 One of Spring Boot's JDBC samples 展示了这一点。
第二个更复杂的选择是使用数据库迁移工具,如Liquibase 或Flyway。迁移工具的优势在于,随着应用程序需求的变化,它可以更轻松地改进数据库模式。 Spring Boot 为 Liquibase 和 Flyway 提供了小型示例应用程序。
【讨论】:
嗨。我相信这里有一些误解。我真正需要的是在我的应用程序已经运行时将 SQL (DDL) 发送到我的数据库引擎,因此在运行时。 想象一下我有一个可供客户端使用的服务,例如:class DBHACKService void executeSQL(String ddl).客户端这样调用: new DBhackService.executeSQL ("create table mytable (name varchar)");在这种方法中,我可以对 sql 进行一些操作。问题是:将它发送到 DBEngine 的最佳方式是什么。再次感谢【参考方案4】:如果您希望动态创建架构,我想这应该对您有所帮助。
Hibernate: Automatically creating/updating the db tables based on entity classes
您可以使用 jdbc 发布 ddl statments 以动态创建表。 将查询保存在某个 xml 文件中。 所以它仍然是通用的。 在配置文件上有一个观察者服务,当文件更新为新查询时,您可以触发所需的 jdbc 调用
【讨论】:
嗨。感谢您的回答。这不会自动生成模式。这将创建与域无关(或至少没有直接相关)的新表。我想要一种在运行时请求创建表的方法。以上是关于Hibernate DDL 表动态创建的主要内容,如果未能解决你的问题,请参考以下文章
菜鸟学SSH(十八)——Hibernate动态模型+JRebel实现动态创建表
hibernate.hbm2ddl.auto =创建(不创建表)
在 Hibernate 5 中未使用 hbm2ddl.auto=update 创建表
为啥即使使用 hibernate.hbm2ddl.auto" value="create",hibernate 也不会自动创建表?