Hibernate和具有相同数据/列但具有不同表名的表

5

我正在处理的数据库有很多表格都有相同的列,但是表格名称却不同(这不是我设计的)。例如(这些是数据库表格名称):

company1Data
company2Data
company3Data
etc.

能否使用JPA和Hibernate将它们映射到一个Java类实体中?该类的名称为“Data”,然后在使用它时,在某个地方传入例如“company1”,这样对象将使用“company1Data”表格?
还是最好像这样只是使用普通的Java对象?
谢谢!

表的结构是什么?如果给定一个对象,你如何确定将其存储在哪个表中? - Tom Anderson
它们前面有一个公司的ID,例如1010Data、9034Data等,我知道这个ID。"INSERT INTO" + id + "data....."。 - shiruba
你的意思是表格的名称前面有ID吗? - Tom Anderson
不是表本身的ID,而是映射在另一张表中的公司ID(公司,公司ID)。因此,具有ID 1010的公司具有名为“1010data”的数据表,具有ID 9034的公司具有名为“9034data”的数据表,等等(有很多,但每个结构都相同)。不想为每个表创建一个新类。 - shiruba
2个回答

1
基本上,这里的问题是一个糟糕(实际上是可怕的)的数据库设计。理想情况下,您只需修复它即可。
如果您无法这样做,我可以看到几种方法。
一种方法是使用继承对其进行建模,使用每个类表映射。您将使Data成为抽象实体,然后创建映射到每个表的微不足道的具体子类。这将起作用,但对于任何未限制在特定类别的查询来说效率都很低,因为它们将涉及查询多个表,并且使用起来很麻烦,因为您需要为每个表使用特定的类别。
另一种方法是使用视图来解决这个问题。创建一个包含所有表并映射到该视图的联合视图。这里的问题是您将无法插入它。您可能能够在这里使用一些聪明的触发器,但这将取决于您的数据库,并且需要更多的数据库和JPA技巧,这超出了我的能力范围!

是的,这很糟糕。我想要么就是表继承(那样会有很多类),要么就是创建一个与表相同的普通Java类,然后在业务逻辑和DAO之间使用它们。我稍微研究了一下hibernate的NamingStrategy,但不确定能否使用它... - shiruba
@shiruba:听起来你已经做了功课。你处于一个不幸的境地,我很同情你。不幸的是,JPA 的设计初衷是为了允许对一个合理的数据库模式进行合理的映射,而不是为了将理智带入一个不合理的数据库模式! - Tom Anderson

0
在我看来,如果你使用Hibernate,速度会更快...
使用Hibernate的JPA的一个巨大优势是你不需要编写一些SQL命令,比如插入和更新。
以下是一些教程,可以帮助你开始使用Hibernate:

http://www.javacodegeeks.com/2012/05/tutorial-hibernate-jpa-part-1.html http://docs.jboss.org/hibernate/orm/3.6/quickstart/en-US/html/hibernate-gsg-tutorial-jpa.html

希望能有所帮助...

以下是一些与您有相同问题的话题:

如何使用 hibernate/jpa 注释将一个类映射到不同的表中

JPA,如何使用相同的类(实体)来映射不同的表格?


谢谢。我知道如何使用Hibernate,但我想知道的是,如果我有几个具有相同列的数据库表,是否可以为它们所有使用一个实体类?@Entity @Table(name="???") - shiruba
是的,我已经查看了它们。可能不可能了...感谢您的帮助。 - shiruba

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接