gpt4 book ai didi

java - 尽管使用@inheritance 插入了冗余的 id 值

转载 作者:行者123 更新时间:2023-11-29 00:10:01 25 4
gpt4 key购买 nike

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

问题是 hibernate 没有采用 id 的值当它向数据库中插入一条新记录时,它已经在数据库中了。相反,hibernate 正在保存一个 idid 相同的后代实体之一中的值存储在其他后代实体之一中。

如何配置 hibernate 以遵守 id当它在同一继承组中保存新实体时,数据库中已有值?

一些相关事实是:

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

我不能使用 @MappedSuperClass对于 BaseEntity因为BaseEntity用作应用程序中实体之一的属性,以便各种类型的实体可以存储在该实体的相同属性中。当我使用 @MappedSuperClass 时, eclipse 给出编译错误说 BaseEntity不能直接实例化,因为它有 @MappedSuperClass注解。

注意:文件共享站点似乎将所有代码居中对齐。您可以通过简单地将其剪切并粘贴到文本编辑器中来解决此问题。

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

可以通过单击 on this link 阅读 id 值被 hibernate 错误设置的实体的代码。 .

保存id设置错误的entity的jpql代码如下:

@Override
@Transactional
public void saveCCD(HL7ConsolidatedCareDocument ccd) {
if (ccd.getId() == null) {
this.em.persist(ccd);
this.em.flush();
}
else {
this.em.merge(ccd);
this.em.flush();
}
}

最佳答案

我从未使用 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
)

当你绕过 hibernate 时,你需要做的是通过更新表 GENERATOR_TABLE 中带有 mykey BaseEntity_Id 的行来保留你需要的 ID。

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

关于java - 尽管使用@inheritance 插入了冗余的 id 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25629485/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com