Исключение TransientObjectException при попытке обновить весь объект

#java #spring-boot #hibernate #jpa

#java #весенняя загрузка #спящий режим #jpa

Вопрос:

Я проверяю, присутствует ли объект уже в БД, а затем обновляю весь объект, если он присутствует, или создаю новый, если нет. Однако при запуске приложения я получаю следующее исключение:

 Caused by: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.model.Students
  

Я посмотрел его в Интернете, но больше ответов было связано с реляционными сопоставлениями, но моя таблица не имеет отношения ни к каким другим таблицам. Я не знаю, что делать. Пожалуйста, помогите.

вот моя модель:

 @Data
@Entity
@Table(name="tbl_student")
public class Students extends People {

    @Id
    @GeneratedValue(strategy=GenerationType.Auto)
    @Column(name="id",insertable =false,nullable = false,updatable = false)
    private Long id;
    
    private int rollNo;

    private String address;

    private String email;

    @Convert(converter = StringListConverter.class)
    private List<String> subjects;

}
  

Класс People:

 @Data
@MappedSuperclass
public class People  {

    private int age;
    private String name;
    private String hobbies;
    private String country;

}
  

Мой репозиторий:

 public interface StudentsRepository extends JpaRepository<Students,Long> {

    @Transactional
    @Modifying
    @Query("update Students s set s = :updatedStudent WHERE s.name = :name")
    void updateStudent(@Param("name") String name, @Param(updatedStudent) Students updatedStudent);

Optional<Students> findByName(String name);

}
  

Это то, что я делаю:

  if(studentsRepository.findByName(value.getName()).isPresent())
                        {
                            studentsRepository.updatestudents(value.getName(),value);
                        }else {
                            studentsRepository.saveAndFlush(value);

                        }
  

Ответ №1:

Если я правильно понимаю исходный код, который выдает исключение, это не Students класс, имеющий временную ссылку, это ссылка.

Это означает, что вы, вероятно, также сохраняете что-то еще, ссылающееся на Students экземпляр, который нуждается в сохранении.