Невозможно обновить запись через Hibernate

Я могу успешно создавать и вставлять записи в таблицу через Hibernate, однако по какой-то причине мой метод обновления не работает.

Для моей таблицы я решил использовать аннотации Java в файле POJO для ее создания.

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

/**
 *
 * @author 
 */

@Entity
@Table(name = "student") //name of DB table that will be created via Hibernate
public class Student {
   @Id //Primary Key
   @Column(name = "id") //map to column
   private Integer id;

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

   @Column(name = "marks")
   private Integer marks;

   public Student(Integer id, String name, Integer marks) {
       this.id = id;
       this.name = name;
       this.marks = marks;
   }

   public Integer getId() {
       return id;
   }

   public void setId(Integer id) {
       this.id = id;
   }

    public String getName() {
       return name;
   }

   public void setName(String name) {
       this.name = name;
   }

   public Integer getMarks(){
       return marks;
   }

   public void setMarks(Integer marks) {
       this.marks = marks;
   }

   @Override
   public String toString() {
       return "Student: " + this.getId() + " | " + this.getName() + " | " + this.getMarks();
   }
}

Как упоминалось выше, таблица успешно создана в базе данных MySQL. Однако я не могу обновить объекты Marks (grade) с помощью моего запроса HQL:

import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

/**
 *
 * @author 
 */
public class HibernateModuleTen {
    private static SessionFactory factory = new Configuration()
                                   .configure("hibernate.cfg.xml")
                                   .addAnnotatedClass(Student.class)
                                   .buildSessionFactory();
    public static void main(String[] args) {


        Session newSession = factory.getCurrentSession();

        try {

            /*Create Student Objects
              in Memory
            */
            Student student1 = new Student(100, "Greg", 95);
            Student student2 = new Student(101, "Mary", 91);
            Student student3 = new Student(102, "Sidi", 90);
            Student student4 = new Student(103, "Rokia", 92);
            Student student5 = new Student(104, "Abdel", 88);
            Student student6 = new Student(105, "Christine", 77);
            Student student7 = new Student(106, "Hamma", 90);
            Student student8 = new Student(107, "Ahmadu", 68);
            Student student9 = new Student(108, "Halimatu", 96);
            Student student10 = new Student(109, "Iziren", 99);

            //Begin transaction
            newSession.beginTransaction();
            //Save all the students
            newSession.save(student1);
            newSession.save(student2);
            newSession.save(student3);
            newSession.save(student4);
            newSession.save(student5);
            newSession.save(student6);
            newSession.save(student7);
            newSession.save(student8);
            newSession.save(student9);
            newSession.save(student10);
            newSession.getTransaction().commit();
            //Update a Student Record
            updateStudent(107, 34);

            //Delete a record if marks are less than 35 and then update Database
            deleteStudent();
            //Print all records
            newSession = factory.openSession();
            newSession.beginTransaction();
            Criteria newCriteria = newSession.createCriteria(Student.class);
            List<Student> students = newSession.createQuery("from Student").list(); //.list is .getResultList in later versions of Hibernate
            for (Student aStudent : students) {
                System.out.println(aStudent.toString());
            }
            newSession.getTransaction().commit();


        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            factory.close();
        }


    }
    public static void updateStudent(Integer id, Integer marks) throws HibernateException {
             /*Update Transaction*/
            Session newSession = factory.openSession();
            newSession.beginTransaction();
            Student studentToUpdate = (Student)newSession.get(Student.class, id); //Choose record 107 to update
            //Update the marks of Student based on ID and marks
            studentToUpdate.setMarks(marks);
            newSession.update(studentToUpdate);
            //Commit to the Transaction
            newSession.getTransaction().commit();
            newSession.close();
    }

    public static void deleteStudent() throws HibernateException {
            Session newSession = factory.openSession();
            newSession.beginTransaction();
            newSession.createQuery("delete from student s where smarks < 35")
                      .executeUpdate(); //Used for updates and deletes
            newSession.getTransaction().commit();
            newSession.close();
    }

}

Метод обновления эффективно берет одну из записей в таблице через столбец id и обновляет элемент в столбце меток.

"удалить из учеников, где smarks <35" имеет опечатку в условии. Если это c & p из исходного кода, вы должны сначала исправить это (s / smarks / marks /).
Markus 23.06.2018 14:08
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
39
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы не публиковали здесь свои ошибки, но похоже, что у вашего класса bean-компонента Student нет конструктора по умолчанию, который вызывается при выполнении

Student studentToUpdate = (Student)newSession.get(Student.class, id);

Вы можете попробовать после добавления конструктора по умолчанию в класс Student вместе со своим настраиваемым конструктором.

Ответ принят как подходящий

Возникла проблема с моим методом удаления:

public static void deleteStudent() throws HibernateException {
            Session newSession = factory.openSession();
            newSession.beginTransaction();
            newSession.createQuery("delete from student s where smarks < 35")
                      .executeUpdate(); //Used for updates and deletes
            newSession.getTransaction().commit();
            newSession.close();
}

Если внимательно присмотреться к запросу, «удалить из студента» должно быть «удалить из ученика» с заглавной буквой s. Неосторожная ошибка.

Другие вопросы по теме