#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
экземпляр, который нуждается в сохранении.