产品具有盈利能力领域,引用了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中删除来解决。