域表收到错误"对象引用未保存的瞬态实例 - 在刷新之前保存瞬态实例"



当我开始使用 JPA 时,我已经看到了错误"org.hibernate.TransientPropertyValueException:对象引用了一个未保存的瞬态实例 - 在刷新之前保存瞬态实例"。我知道这个错误在一般情况下是添加 cascade=CascadeType.ALL 解决的,但在这种情况下,这个错误出现在域表中,这意味着,在这种情况下放置 CascadeType 没有任何意义,因为这个实体已经在数据库中有一个 ID。

我的代码的相关部分是(还有其他字段、getter、setter 等):

类赛车:

@Entity
@Table(name = "RAC", schema = "SchRAC")
public class Rac {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "RacCod")
private Long idRac;
//anoter fields (...)
@OneToMany(fetch = FetchType.LAZY, mappedBy = "rac", cascade = {CascadeType.ALL})
@JsonManagedReference 
private List<RacProvidencia> racProvidencias;

类 RacProvidencia:

@Entity
@Table(name = "RACPRO", schema = "SchRAC")
public class RacProvidencia implements Serializable {
/**
* 
*/
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY) 
@Column(name = "RacProCod")
private Long idRacProvidencia;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "RacCod")
@JsonBackReference //coloquei para evitar a recursao infinita de JSON
private Rac rac;
@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.REFRESH)
@JoinColumn(name = "ProCod")
private Providencia providencia;
@NotNull
@Column(name = "RacProNum", length = 100)
private String numero;
@Column(name = "RacProDat")
private Date dataProvidencia;

类普罗维登西亚(域表):

@Entity
@Table(name = "PRO", schema = "SchRAC")
public class Providencia {
@Id
@Column(name = "ProCod")
private Integer idProvidencia;
@Column(name = "ProDes", length = 50)
private String descricao;

服务:

public RacProvidencia adicionarProvidenciaRac(Long codigo, @Valid RacProvidencia racProvidencia) {
Rac rac = this.racRepository.findById(codigo).get();
racProvidencia.setRac(rac);
return racProvidenciaRepository.save(racProvidencia);
}

如您所见,对象"Rac"已经保存,然后用户如果愿意,可以添加"Providencias"。然后我收到对象"普罗维登西亚",按 ID 搜索对象 Rac,设置对象并保存。

此错误最奇怪的部分是因为,5分钟后,系统不再显示此错误。可能会发生什么?将来如何避免此问题?

您有双向关系,但只设置了关系的一侧。

public RacProvidencia adicionarProvidenciaRac(Long codigo, @Valid RacProvidencia racProvidencia) {
Rac rac = this.racRepository.findById(codigo).get();
racProvidencia.setRac(rac);
rac.getRacProvidencias().add(racProvidencia);  // <-- This
return racProvidenciaRepository.save(racProvidencia);
}

您的持久性提供程序在两端都需要这一点。

最新更新