【问题标题】:Domain table getting error “object references an unsaved transient instance - save the transient instance before flushing”域表出现错误“对象引用了未保存的瞬态实例 - 在刷新之前保存瞬态实例”
【发布时间】:2019-10-31 10:10:37
【问题描述】:

当我开始使用 JPA 时,我已经看到错误“org.hibernate.TransientPropertyValueException:对象引用了未保存的瞬态实例 - 在刷新之前保存瞬态实例”。我知道这个错误一般是通过添加 cascade=CascadeType.ALL 来解决的,但是在这种情况下,这个错误已经出现在域表中,也就是说,在这种情况下放置 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;

类 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;

类Providencia(域表):

@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”。然后我收到对象“Providencia”,按 Id 搜索对象 Rac,设置对象并保存。

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

【问题讨论】:

    标签: hibernate spring-boot jpa spring-data-jpa spring-data


    【解决方案1】:

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

    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);
    }
    

    您的持久性提供者在双方都需要。

    【讨论】:

    • 其实我得写 rac.getRacProvidencias().add(racProvidencia);在 racProvidencia.setRac(rac) 之前;对吗?
    • 我已经按照您的建议进行了操作,该对象正在保存且没有错误,但是当我尝试使用相同的方法进行更新时,应用程序显示错误“传递给持久化的分离实体”
    猜你喜欢
    • 2021-06-26
    • 2012-02-27
    • 2019-01-14
    • 2012-03-21
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 2013-01-04
    相关资源
    最近更新 更多