gpt4 book ai didi

java - 复合实体的更新失败

转载 作者:行者123 更新时间:2023-12-04 07:04:25 25 4
gpt4 key购买 nike

我有与位置实体组合的 Person 实体

@ManyToOne(fetch = FetchType.EAGER, cascade =
{ CascadeType.PERSIST, CascadeType.MERGE })
@Cascade(
{org.hibernate.annotations.CascadeType.SAVE_UPDATE })
public Location getLocation()
{
return location;
}

并且位置实体的名称为 ID
@Id
public String getName()
{
return name;
}

当人员的位置在 Spring MVC 表单中从 L1 更改为 L2 时,我收到以下异常,其中此人员实体是表单的 modelAttribute。

org.springframework.orm.hibernate3.HibernateSystemException:identifier of an instance of com.x.y.z.Location was altered from L2 to L1; nested exception is org.hibernate.HibernateException: identifier of an instance of com.x.y.z.Location was altered from L2 to L1

最佳答案

你很困惑CompositionAssociation .

你映射的是一个关联; Hibernate (JPA) 中的组合通过 @Embeddable 映射/@Embedded注释。关联是独立实体之间的关系;它们通常通过实体标识符(数据库中的外键)连接。

在您的特定情况下,Person实体指向 Location实体表示在数据库中 PERSONS table 上有一个 LOCATION_ID外键(名称可能不同)到 LOCATIONS table 。您要做的是在 Location 上更新该 key end 这是非法的,因为它会切断 Hibernate 的关系(另一端仍然在内部保存以前的键值)。

主键通常应该是代理的,并且一开始就不可更新;如果您确实需要“更新”它,则必须取消关联 Location来自 Person , 更新 Location并将其分配给 Person再次或创建一个全新的Location实例并将其分配给您的 Person .

综上所述,如果您真的想为 Composition 关系建模,则需要将 @ManyToOne 替换为 @Embedded 并相应地更改表架构。这是一个链接
mapping components 上的 Hibernate 注释文档.

此外,在两个单独的注释(JPA 与 Hibernate 扩展)中指定级联类型并不是一件好事。如果你真的需要 Hibernate 扩展(在这种情况下你不需要),只需使用它并留下 cascade JPA 注释中的属性为空。

关于java - 复合实体的更新失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1341889/

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