Hibernate 域表获取错误“;对象引用未保存的临时实例-在刷新之前保存临时实例”;

Hibernate 域表获取错误“;对象引用未保存的临时实例-在刷新之前保存临时实例”;,hibernate,spring-boot,jpa,spring-data-jpa,spring-data,Hibernate,Spring Boot,Jpa,Spring Data Jpa,Spring Data,当我开始使用JPA时,我已经看到错误“org.hibernate.TransientPropertyValueException:对象引用未保存的临时实例-在刷新之前保存临时实例”。我知道,通过添加cascade=CascadeType.ALL,可以解决general上的此错误,但在本例中,此错误出现在域表中,这意味着在本例中放置CascadeType没有任何意义,因为此实体在数据库中已经有Id 我的代码的相关部分是(还有其他字段、getter、setter等): Rac类: @Entity @

当我开始使用JPA时,我已经看到错误“org.hibernate.TransientPropertyValueException:对象引用未保存的临时实例-在刷新之前保存临时实例”。我知道,通过添加cascade=CascadeType.ALL,可以解决general上的此错误,但在本例中,此错误出现在域表中,这意味着在本例中放置CascadeType没有任何意义,因为此实体在数据库中已经有Id

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

Rac类:

@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;
类(域表):

服务:

public RacProvidencia adicionarProvidenciaRac(Long codigo, @Valid RacProvidencia racProvidencia) {
    Rac rac = this.racRepository.findById(codigo).get();
    racProvidencia.setRac(rac);
    return racProvidenciaRepository.save(racProvidencia);
}
如您所见,对象“Rac”已经保存,如果用户愿意,则添加“Providencias”。然后我收到对象“Providencia”,按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);
}
public-RacProvidencia-adicionarProvidenciaRac(长密码,@Valid-RacProvidencia-RacProvidencia){
Rac Rac=this.racRepository.findById(codigo.get();
rac.setRac(rac);

rac.getRacProvidencias().add(racProvidencia);//实际上,我必须在racProvidencia.setRac(rac)之前编写rac.getRacProvidencias().add(racProvidencia);对吗?我像你建议的那样,保存对象时没有错误,但当我尝试使用相同的方法更新时,应用程序显示错误“已分离实体已传递到持久化”
public RacProvidencia adicionarProvidenciaRac(Long codigo, @Valid RacProvidencia racProvidencia) {
    Rac rac = this.racRepository.findById(codigo).get();
    racProvidencia.setRac(rac);
    return racProvidenciaRepository.save(racProvidencia);
}
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);
}