Hibernate:有没有办法以编程方式创建类似于现有表的新表?

时间:2009-03-04 01:26:10

标签: java database hibernate database-permissions datahistory

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

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

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

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


我的问题

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

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

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

谢谢!!!

[编辑 - 解决方案]

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

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

select * into targettable from sourcetable where 1=0

答案 2 :(得分:0)

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