Ошибка получения таблицы доменов: «объект ссылается на несохраненный временный экземпляр - сохраните временный экземпляр перед сбросом» - PullRequest
0 голосов
/ 17 июня 2019

Я уже видел ошибку «org.hibernate.TransientPropertyValueException: объект ссылается на несохраненный временный экземпляр - сохраните временный экземпляр перед сбросом», когда я начал работать с JPA.Я знаю, что эта ошибка в общем случае решается добавлением cascade = CascadeType.ALL, но в этом случае эта ошибка появилась в доменной таблице, то есть, нет смысла помещать CascadeType в этом случае, потому что эта сущность уже имеетИдентификатор в базе данных.

Соответствующая часть моего кода (есть другие поля, методы получения, установки и т. д.):

Class 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", ищу объект Rac по Id, устанавливаю объект и сохраняю.

Самой странной частью этой ошибки является то, что через 5 минут система больше не отображает эту ошибку.Что может случиться?Как я мог избежать этой проблемы в будущем?

1 Ответ

1 голос
/ 17 июня 2019

У вас двунаправленные отношения, но вы устанавливаете только одну сторону отношений.

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

Это необходимо вашему поставщику персистентности с обеих сторон.

...