Строка гибернации не сохраняется в базе данных

#java #spring #hibernate

#java #весна #гибернация

Вопрос:

Гибернация не сохраняет мой объект в базе данных. Почему это происходит? Я неправильно выполняю транзакции? Что касается регистрации того, что делает hibernate, в нем говорится, что «org.hibernate.SQL — вставить в значения student (email, first_name, last_name) (?, ?, ?) «. Я думаю, это означает, что он даже не знает, какие значения вводить, хотя я создал объект Student с помощью конструктора аргументов.

Вот мой код

 @SpringBootApplication
public class DemoApplication {
    

    
public static void main(String[] args) {

    ApplicationContext ctx = new AnnotationConfigApplicationContext(AnimalConfig.class, HibernateConfig.class); // Makes the sessionFactory bean known to the IOC
    SessionFactory sessionFactory = (SessionFactory)ctx.getBean("sessionFactory");


        Session session = sessionFactory.getCurrentSession();
        Student aStudent = new Student("test","TEstinfdasddadas","bob@gmail.com");  //This is a transient instance which means that It's not related to the database, it's temporary
        
        try {
            session.beginTransaction();
            session.save(aStudent);
            session.getTransaction().commit();
        }catch(Exception e){
            System.out.println(e.getMessage());
        }finally{
            session.close();
        }
    
    
    (( ConfigurableApplicationContext )ctx).close();  //Close the applicationContext
    SpringApplication.run(DemoApplication.class, args);

}

 }
 

Вот мой объект Student

 @Entity(name = "student") 
@Table(name = "student")  
public class Student {

@Id   
@GeneratedValue( strategy = GenerationType.IDENTITY)  
@Column(name = "id") 
private int id;
@Column(name = "first_name")
private String firstName;

@Column(name = "last_name")
private String lastName;

@Column(name = "email")
private String email;

public Student() {
}
public Student(String firstName, String lastName, String email) {
    this.firstName = firstName;
    this.lastName = lastName;
    this.email = email;
}
 

Комментарии:

1. Можете ли вы написать session.beginTransaction() в переменной и вызвать .commit() для этой переменной? Когда вы вызываете session.getTransaction(), возможно, вы получаете новый объект транзакции?

2. Извините, я не уверен, что вы хотите, чтобы я сделал. «Записать session.beginTransaction() в переменную», что означает в переменной?

3. например: транзакция tr = session.beginTransaction(); после этого не вызывайте эту session.getTransaction().commit(); попробуйте вызвать tr.commit();

4. Вы должны показать код для объекта student. Также увеличьте уровень ведения журнала в режиме гибернации и посмотрите, что на самом деле делает hibernate.

5. Хорошо, я обновил сообщение и включил объект Student. Что касается уровня ведения журнала, я думаю, что Hibernate даже не знает о значениях объекта Student, который я прошу его вставить. В нем говорится org.hibernate. SQL — вставить в значения student (email, first_name, last_name) (?, ?, ?) Я знаю, что он знает, какую базу данных я использую, поскольку он автоматически создает таблицу Student в MySQL для меня, как я и хотел. Я не хочу быть этим парнем, но я также очень новичок в гибернации и не знаю, как и большинство из того, что означает ведение журнала

Ответ №1:

Возможно, вы не настроили гибернацию для выполнения очистки при фиксации. Попробуйте использовать session.flush() перед фиксацией.