在使用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
答案 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