尽管使用了@inheritance,但仍插入了冗余的id值

时间:2014-09-02 17:58:03

标签: java mysql hibernate jpa

在使用hibernate,jpa和MySQL的spring mvc应用程序中,我有一个BaseEntity,其中包含id字段,该字段在从BaseEntity继承的所有类中都是唯一的,使用{ {1}}。使用从命令行运行的外部@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)文件将一些数据导入MySQL数据库。精心规划导入的数据,以便需要作为dml.sql继承组的一部分进行管理的所有id在其继承组中是唯一的。

问题是,当hibernate将新记录插入数据库时​​,它不会考虑数据库中已有的BaseEntity的值。相反,hibernate在其中一个后代实体中保存id值,该值与存储在其他一个后代实体中的id相同。

如何将hibernate配置为在同一继承组中保存新实体时尊重数据库中已有的id值?

一些相关事实

MySQL数据库中的所有对象都是使用id直接从应用程序中的hibernate映射创建的。

我无法将hbm2ddl用于@MappedSuperClass,因为BaseEntity被用作应用中某个实体的属性,因此各种类型的实体可以存储在同一属性中那个实体。当我使用BaseEntity时,eclipse发出了编译错误,指出@MappedSuperClass无法直接实例化,因为它有BaseEntity注释。

注意:文件共享网站似乎是中心验证所有代码。您只需将其剪切并粘贴到文本编辑器中即可解决此问题。

您可以阅读BaseEntity by clicking on this link的代码。

点击on this link可以读取hibernate错误设置了id值的实体的代码。

用于保存id设置不正确的实体的jpql代码如下:

@MappedSuperClass

1 个答案:

答案 0 :(得分:1)

我从来没有使用过hibernate或者mysql来完成这个与EclipseLink + PostgreSQL类似的东西。所以下面可能会有一些错误。

使用生成类型TABLE,您可能希望使用TableGenerator批注显式指定一些其他参数。这样你就可以确定hibernate在哪里存储东西。

@Id 
@GeneratedValue(
    strategy=GenerationType.TABLE, 
    generator="TBL_GEN")
@javax.persistence.TableGenerator(
    name="TBL_GEN",
    table="GENERATOR_TABLE",
    pkColumnName = "mykey",
    valueColumnName = "hi"
    pkColumnValue="BaseEntity_Id",
    allocationSize=20
)

绕过休眠时需要做的是通过使用表GENERATOR_TABLE中的mykey BaseEntity_Id更新行来保留所需的ID。

有关注释的详细信息,请参阅paragraph 5.1.2.2