You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Hibernate报错Save the transient instance before flushing,配置CascadeType.ALL仍无效

问题原因

  • 你的Alquiler实体类中peliculas字段的注解配置冲突,导致配置的级联保存规则未生效:
    1. 你在peliculas字段上添加了@ElementCollection、@Column注解,这两个注解适用于基础类型/嵌入式类的集合映射,不适用于一对多的实体关联场景
    2. 你将@OneToMany加在了getPeliculas方法上,默认情况下JPA会优先识别字段上的注解,因此你配置的CascadeType.ALL规则实际没有生效,Hibernate不会自动级联保存未持久化的Pelicula实例,因此抛出瞬态实例未保存的错误。
  • 额外的潜在问题:socio属性的@JoinColumn配置错误,name = "id"会和Alquiler自身的主键字段冲突,后续也可能引发主键异常。

解决方案

第一步:修正peliculas属性的注解配置

删除peliculas字段上的无效注解,统一@OneToMany的注解位置,示例修正后代码:

// 删除字段上的@Column、@ElementCollection注解
private List<Pelicula> peliculas;

// 保持getter上的@OneToMany配置即可,或者直接将@OneToMany移到字段上
@OneToMany(targetEntity=Pelicula.class, cascade = CascadeType.ALL,orphanRemoval = true)
public List<Pelicula> getPeliculas() {
    return peliculas;
}

第二步:修正socio属性的关联配置

修改@JoinColumn的名称,避免和自身主键冲突:

@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "socio_id") // 改为自定义的外键字段名
private Socio socio;

可选优化(业务逻辑合理性修正)

你当前三个Alquiler实例共用了同一个Pelicula集合,如果业务上一部电影可以被多个租赁单关联,建议将Alquiler和Pelicula的关联改为@ManyToMany;如果一部电影同一时间只能属于一个租赁单,需要为每个Alquiler创建独立的Pelicula实例,避免关联冲突。


内容的提问来源于stack exchange,提问作者M Jasso

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 20:06:03