我最近将我的项目从Hibernate 5.4更新为Hibernate 6.6,现在我遇到了以前没有发生的错误。 我有两个实体:

问题描述 投票:0回答:0

产品具有盈利能力领域,引用了Product -Profitityentity。 ProductProfitabilityentity有一个产品字段引用Productentity。


产品:
package br.com.triersistemas.cloud.platform.desktop.entity.product; import br.com.triersistemas.cloud.database.entity.AuditingExternalEntity; import br.com.triersistemas.cloud.platform.desktop.entity.productprofitability.ProductProfitabilityEntity; import jakarta.persistence.*; import jakarta.validation.Valid; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import lombok.experimental.SuperBuilder; import java.util.UUID; @AllArgsConstructor @NoArgsConstructor @SuperBuilder @Entity @Table(name = "product") public class ProductEntity extends AuditingExternalEntity { @Getter @Setter @Id @Column(name = "id") private UUID id; @Getter @Setter @Column(name = "product_code") private Long productCode; // Contains one ProductProfitabilityEntity @Valid @OneToOne(mappedBy = "product", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true) private ProductProfitabilityEntity profitability; }

生产能力:
  • package br.com.triersistemas.cloud.platform.desktop.entity.productprofitability; import br.com.triersistemas.cloud.database.entity.AuditingEntity; import br.com.triersistemas.cloud.platform.desktop.entity.product.ProductEntity; import jakarta.persistence.*; import jakarta.validation.Valid; import jakarta.validation.constraints.NotNull; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import lombok.experimental.SuperBuilder; import java.util.UUID; @AllArgsConstructor @NoArgsConstructor @SuperBuilder @Entity @Table(name = "product_profitability") public class ProductProfitabilityEntity extends AuditingEntity { @NotNull(message = "Unique identifier is required.") @Getter @Setter @Id @Column(name = "id") private UUID id; // Refers to the container ProductEntity // Using OneToOne with MapsId, so: ProductProfitabilityEntity.id = ProductEntity.id @Valid @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL) @JoinColumn(name = "id") @MapsId private ProductEntity product; }

      问题
    • 当我尝试节省生产力时,我会收到以下错误:
    org.springframework.orm.ObjectOptimisticLockingFailureException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [br.com.triersistemas.cloud.platform.desktop.entity.productprofitabilityentity.ProductProfitabilityEntity#fb01b3e0-f12e-4380-b82a-2f2882fadaf1]

我对问题的理解:

Hibernate认为Product -ProfitityAnityentity已经具有ID,并试图从数据库中获取它,以确定它应该执行更新还是插入。但是,由于该实体尚不存在,因此可能会引发此例外。
我没想到,因为没有

@@generatedValue

,并且该实体不存在,所以Hibernate会用提供的ID插入它而不是失败。
如果我在保存之前手动将product -Profititientity的ID设置为null,则一切正常,可以正确插入并映射关系。但是,由于我的API接收到完全填充的复制数据(以前使用的数据),因此将ID设置为NULL并不是理想的解决方案。
冬眠6.6中的变化是什么?

在更新之前,没有发生此问题。我想了解

在Hibernate 6.6中发生了什么变化,现在正在引起这种行为?

在保存Productitity之前,与手动设置Product -Profitityentity.ID = null更好的解决方案?

	

通过将@mapsid从product -profitabilityentity中删除来解决。

hibernate spring-data-jpa
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.