首页 > 解决方案 > 如果版本为空,则弹簧数据(休眠)防止使用任何 CascadeType 对惰性 ManyToOne 对象进行编辑

问题描述

我有这个对象在保存之前在休眠状态下是瞬态的,我从休息服务中得到它:

@Entity
@Table(name = "SWC_EXCEPTION_MAPPING")
public class ExceptionMapping extends BaseEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "EXCEPTION_MAPPING_SEQ")
    @SequenceGenerator(sequenceName = "EXCEPTION_MAPPING_SEQ", allocationSize = 1, name = "EXCEPTION_MAPPING_SEQ")
    private Long id;

    @NotNull
    @ManyToOne(fetch = FetchType.LAZY)
    private Supplier supplier;
}

@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseEntity implements Serializable {
    @CreatedDate
    @Column(name = "CREATED_DATE", updatable = false, nullable = false)
    private Date createdDate;
    @Version
    @NotNull
    private Integer version;
}

对象值为: 在此处输入图像描述

当我尝试使用此代码保存带有弹簧数据的对象时,出现此错误:

代码:

@Repository
public interface ExceptionMappingRepository extends JpaRepository<ExceptionMapping, Long> {
}

@Service
public class ExceptionMappingServiceImpl implements ExceptionMappingService {

private final ExceptionMappingRepository exceptionMappingRepository;
    private final ExceptionMappingCustomRepository exceptionMappingCustomRepository;

    private final SupplierService supplierService;

    public ExceptionMappingServiceImpl(ExceptionMappingRepository exceptionMappingRepository) {
        this.exceptionMappingRepository = exceptionMappingRepository;
    }


    public void edit(ExceptionMapping exceptionMapping) {
        /* this line */
        exceptionMappingRepository.save(exceptionMapping);
    }
}

非空属性引用瞬态值 - 瞬态实例必须在当前操作之前保存:ExceptionMapping.supplier -> Supplier

我知道此错误发生在供应商版本为空时,因为当我手动将其设置为零时,此错误不会出现!

我的问题是,为什么supplier我没有为此设置任何 CascadeType 时在对象中休眠检查版本?

我使用这个版本的弹簧靴:2.3.12.RELEASE

标签: hibernatespring-data

解决方案


因为你说Supplier extends BaseEntity,我猜这version是强制性的。

如此处所述https://docs.jboss.org/hibernate/orm/5.5/userguide/html_single/Hibernate_User_Guide.html#locking-optimistic

对于分离的实例,版本或时间戳属性永远不能为空。

这就是你得到错误的原因。


推荐阅读