hibernate动态创建表

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hibernate动态创建表相关的知识,希望对你有一定的参考价值。

在一个项目中,需要生成一个“bonus +年份(4位)+月份(2位,前补零)”表存放每个会员每个月的贡献值,映射文件为TotalContribute.hbm.xml,实体类为TotalContribute,包含属性有id,email,contribute,请教怎么实现!
1楼的朋友,你理解错误啦,我是每个月列张表记录每个会员这个月的总的贡献值啦!
2楼的朋友,是像你说的那样!
2楼的朋友,我是用jdbc实现的,但是这样做有个缺陷,就是首先我每次都必须创建一个表,再插入数据,这样的话,如果我在一个月之内就只能执行一次了,不然就提示说表存在了,不能创建表了,请问有什么好的方法解决这个问题么!

你这种设计有问题啊。每注册一个会员创建一个表,重新加载hbm,是不是还要刷新一次sessionFactory?如果有人不停注册,那你的服务还跑不跑了?

你计算贡献值完全可以放在一个表中通过1对多或者HQL来过滤。

如果非要分表做,那就远离hbm,通过session.createSQLQuery()调用本地sql语句对数据库直接进行操作。

=================

理解错了,抱歉。这个可以结合你的数据库来看了。 我对pgsql比较熟, pgsql支持子表, 可以建立一个父表,然后每个月建立一个子表,查询的时候直接查询父表, pgsql会根据查询条件里的时间范围自动决定是在所有子表中查还是在特定子表中查。select * from 父表是可以检索到所有值的,这个机制在物理上又实现了数据水平切分和可管理性。

所以如果支持父-子表机制的数据库里,可以通过数据库本身的特性来实现,hbm不需要改变,映射到父表即可。insert时候会自动写入子表。如果子表不存在则写入父表。

如果在不支持父-子机制的数据库里,查询通过createSQLQuery来做,Hibernate支持将未映射的查询结果Transform为特定的类型的对象。例如:

query.setResultTransformer(Transformers.aliasToBean(MyObject.class));
query.list();

insert通过时间字段计算出要写入的数据表,通过insert来执行写入。

总之,我给出的意见就是,支持子表特性的数据库HBM来实现,不支持子表特性或者想脱离数据库依赖那就用SQL来实现。
参考技术A 每个月列张表记录每个会员这个月的总的贡献值。
那就是说你数据库里一个月要生成一张表是么?
我目前还没见过可以再hibernate映射文件中把数据库表名设成参数,建议你就用JDBC直接来吧!
大哥!你可以在建表之前查询该月的表是否存在啊!
存在就不建!不存在再建!

Hibernate DDL 表动态创建

【中文标题】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动态创建表的主要内容,如果未能解决你的问题,请参考以下文章

菜鸟学SSH(十八)——Hibernate动态模型+JRebel实现动态创建表

JPQL / Hibernate 查询的动态表名

运行服务器时,Hibernate 不创建表

JPA/Hibernate 无法创建名为 Order 的实体

Spring with Hibernate-如何动态传递模式名称

spring+hibernate集成动态修改表结构,网上要对LocalSessionFactory进行小小的修改