【问题标题】:Hibernate: Is there a way to programatically create new tables that resemble an existing one?Hibernate:有没有办法以编程方式创建类似于现有表的新表?
【发布时间】:2010-10-11 04:05:15
【问题描述】:

我有一个包含许多表的网络应用程序(每个表都代表一个 POJO)。我为每个类编写了映射文件,然后使用 Hibernate 的SchemaExport 在我的数据库中生成表。现在我想为每个已创建的现有表创建 2 个附加表:

  • 用户权限表 - 存储特定于每个字段的 POJO 上的用户权限
    POJO中的每一列代表一个字段,每一行代表一个用户,每个单元格将有一个值“读”、“写”等,代表用户对该字段的权限

  • 数据历史记录表 - 使用版本号存储所有数据历史记录
    此表将包含 POJO 表所具有的所有列,以及 4 个附加字段:数据对象版本、事务 GUID(主键)、数据戳和执行此事务的用户。

我希望能够在创建这些表后通过 Hibernate 访问这些表。这样我就可以轻松地在其中添加/删除/更新条目。


我的问题

附加表上的大多数列将与 POJO 表相同。所以我认为以某种方式引用 POJO 表可能比创建全新的表更好。这样,如果 POJO 表中添加了新字段,这些表将自动进行更改。但我似乎不知道该怎么做。我想也许有一些方法:

  • 创建以某种方式引用 POJO 表的休眠映射文件
    例如在我的新 POJOPermission.hbm.xml 文件中,以某种方式指定,使用与 POJO 表相同的字段,并添加这些新字段。
  • 编写 Java 代码在 Hibernate 中创建表
    例如我可以使用 java.lang.Class 向我返回 POJO 中所有字段的列表,然后遍历这些字段,以某种方式将它们设置为我的新表的列标题,然后 以某种方式 在运行时调用 Hibernate 来创建这些表

有人可以告诉我如何执行上述任一操作,或解决此问题吗?我有一种感觉,我可能以错误的方式思考这个......

谢谢!!!

[编辑-解决方案]

我最终使用 XSLT 将原始 hbm.xml 文件转换为新文件,更改字段类型等。并指定 hibernate.cfg.xml 文件以包含新生成的文件。最后只需运行 schemaexport 即可将所有 java 文件一起生成...

【问题讨论】:

  • 你为什么不提供你的解决方案作为答案并接受它,这样它就不会挂在“未回答”的问题上?

标签: java database hibernate database-permissions datahistory


【解决方案1】:

CREATE TABLE 语法是特定于实现的。 DB2 有 CREATE TABLE LIKE ,但是您需要解析目录表以检索键,外国和国内,然后生成 ALTER TABLE... 来实现相同的。其他数据库可能也有类似的。

【讨论】:

    【解决方案2】:

    使用“select into”可以创建基本表结构的副本。它只复制列和数据类型,而不是约束或索引。如果您只想要没有数据的结构,只需指定一个不返回任何记录的 where 子句。

    select * into targettable from sourcetable where 1=0
    

    【讨论】:

      【解决方案3】:

      如果您想通过 Hibernate 访问用户权限和数据历史记录,那么我认为您需要通过考虑如何将这些表示为 POJO 来解决问题。然后,您可以生成映射以将它们存储在数据库中。

      【讨论】:

        猜你喜欢
        • 2020-11-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多