Hibernate报错Save the transient instance before flushing,配置CascadeType.ALL仍无效
问题原因
- 你的
Alquiler实体类中peliculas字段的注解配置冲突,导致配置的级联保存规则未生效:- 你在
peliculas字段上添加了@ElementCollection、@Column注解,这两个注解适用于基础类型/嵌入式类的集合映射,不适用于一对多的实体关联场景 - 你将
@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
相关产品推荐
相关产品推荐

