Ошибки при добавлении записи Hiberbate

Есть БД, которая содержит две таблицы Otdelenie и Doctors. Связаны они так: Otdelenie.id = Doctors.otdelenie_id. При добавлении записи в таблицу Otdelenie выходит ошибка NullPointerException. Ниже приведены все классы. Подскажите пожалуйста в чем ошибка?

Класс Otdelenie

@Entity
@Table(name = "otdelenie")
public class Otdelenie {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    @Column
    private String text;

    public Otdelenie() {}
    public int getId() {return id;}
    public void setId(int id) {this.id = id;}
    public String getText() {return text;}
    public void setText(String text) {this.text = text;}
    public Otdelenie(String text) {this.text = text;}
}

Класс Doctors

@Entity
@Table(name = "doctors")
public class Doctors {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    @Column
    private String text;
    @Column
    private int otdelenie_id;

    @ManyToOne
    @JoinColumn(name = "otdelenie_id", nullable = false)
    private Otdelenie otdelenie;

    public Doctors() {}
    public Doctors(String text, int otdelenie_id) {this.text = text; this.otdelenie_id = otdelenie_id;}

    public int getId() {return id;}
    public int getOtdelenie_id() {return otdelenie_id;}
    public void setOtdelenie_id(int otdelenie_id) {this.otdelenie_id = otdelenie_id;}
    public void setId(int id) {this.id = id;}
    public String getText() {return text;}
    public void setText(String text) {this.text = text;}    
}

Класс OtdelenieDao

public class OtdelenieDao {
    public void save(Otdelenie otdelenie) {
        Session session = HibernateSessionFactoryUtil.getSessionFactory().openSession();
        Transaction transaction = session.beginTransaction();
        session.save(otdelenie);
        transaction.commit();
        session.close();
    }

    public Otdelenie findByID(int id) {
        return HibernateSessionFactoryUtil.getSessionFactory().openSession().get(Otdelenie.class, id);
    }

    public void update(Otdelenie otdelenie) {
        Session session = HibernateSessionFactoryUtil.getSessionFactory().openSession();
        Transaction transaction = session.beginTransaction();
        session.update(otdelenie);
        transaction.commit();
        session.close();
    }

    public void delete(Otdelenie otdelenie) {
        Session session = HibernateSessionFactoryUtil.getSessionFactory().openSession();
        Transaction transaction = session.beginTransaction();
        session.delete(otdelenie);
        transaction.commit();
        session.close();
    }

    public List<Otdelenie> getOtdWithId(int id) {
        List<Otdelenie> list = (List<Otdelenie>) HibernateSessionFactoryUtil.getSessionFactory().openSession()
                .createQuery("FROM Otdelenie WHERE id = :id")
                .setParameter("id", id)
                .list();

        return list;
    }
}

Класс DoctorsDao

public class DoctorsDao {
    public void save(Doctors doctors) {
        Session session = HibernateSessionFactoryUtil.getSessionFactory().openSession();
        Transaction transaction = session.beginTransaction();
        session.save(doctors);
        transaction.commit();
        session.close();
    }

    public Doctors findByID(int id) {
        return HibernateSessionFactoryUtil.getSessionFactory().openSession().get(Doctors.class, id);
    }

    public void update(Doctors doctors) {
        Session session = HibernateSessionFactoryUtil.getSessionFactory().openSession();
        Transaction transaction = session.beginTransaction();
        session.update(doctors);
        transaction.commit();
        session.close();
    }

    public void delete(Doctors doctors) {
        Session session = HibernateSessionFactoryUtil.getSessionFactory().openSession();
        Transaction transaction = session.beginTransaction();
        session.delete(doctors);
        transaction.commit();
        session.close();
    }

    public List<Doctors> getDoctorsWithId(int id) {
        List<Doctors> list = (List<Doctors>) HibernateSessionFactoryUtil.getSessionFactory().openSession()
                .createQuery("FROM Doctors WHERE id = :id")
                .setParameter("id", id)
                .list();

        return list;
    }
}

Класс DoctorsService

public class DoctorsService {
    DoctorsDao doctorsDao = new DoctorsDao();
    private ObservableList<Doctors> doctors = FXCollections.observableArrayList();

    public ObservableList<Doctors> getDoctorsList() {
        return doctors;
    }

    public DoctorsService() {}

    public void createDoctorsItem(Doctors doctors) {
        doctorsDao.save(doctors);
    }

    public void updateDoctorsItem(Doctors doctors) {
        doctorsDao.update(doctors);
    }

    public void deleteDoctorsItem(Doctors doctors) {
        doctorsDao.delete(doctors);
    }

    public Doctors findByID(int id) {
        return doctorsDao.findByID(id);
    }

    public void getDoctorsWithId(int id) {
        doctors = FXCollections.observableArrayList();
        doctors.addAll(doctorsDao.getDoctorsWithId(id));
    }
}

Класс OtdelenieService

public class OtdelenieService {
    OtdelenieDao otdelenieDao = new OtdelenieDao();
    private ObservableList<Otdelenie> otdelenieList = FXCollections.observableArrayList();

    public ObservableList<Otdelenie> getotdelenieList() {
        return otdelenieList;
    }

    public OtdelenieService() {}

    public void createotdelenieItem(Otdelenie otdelenie) {
        otdelenieDao.save(otdelenie);
    }

    public void updateotdelenieItem(Otdelenie otdelenie) {
        otdelenieDao.update(otdelenie);
    }

    public void deleteotdelenieItem(Otdelenie otdelenie) {
        otdelenieDao.delete(otdelenie);
    }

    public Otdelenie findByID(int id) {
        return otdelenieDao.findByID(id);
    }

    public void getOtdWithId(int id) {
        otdelenieList = FXCollections.observableArrayList();
        otdelenieList.addAll(otdelenieDao.getOtdWithId(id));
    }
}

Добавление элементов:

public class LoginController {

    OtdelenieService otdelenieService = new OtdelenieService();
    DoctorsService doctorsService = new DoctorsService();

    private Stage loginStage;

    public void initialize() {
    }

    public void setLoginStage(Stage loginStage) {
        this.loginStage = loginStage;
    }

    public Stage getLoginStage() {
        return loginStage;
    }

    public void onCancel(ActionEvent actionEvent) {
        otdelenieService.createotdelenieItem(new Otdelenie("Отделение 1"));
    }

    public void onOK(ActionEvent actionEvent) throws IOException {
        doctorsService.createDoctorsItem(new Doctors("Doc 1", 1));

        ObservableList<Doctors> list = FXCollections.observableArrayList();

        doctorsService.getDoctorsWithId(1);

        list.addAll(doctorsService.getDoctorsList());

        for (Doctors doctors: list            ) {
            System.out.println(doctors.getText() + " " + doctors.getOtdelenie_id());
        }
    }
}

При нажатии на onCancel ошибка ссылается на метод save класса OtdelenieDao.

StackTrace:

окт 01, 2021 12:59:21 PM org.hibernate.Version logVersion INFO: HHH000412: Hibernate ORM core version 5.5.7.Final окт 01, 2021 12:59:21 PM org.hibernate.annotations.common.reflection.java.JavaReflectionManager INFO: HCANN000001: Hibernate Commons Annotations {5.1.2.Final} окт 01, 2021 12:59:21 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure WARN: HHH10001002: Using Hibernate built-in connection pool (not for production use!) окт 01, 2021 12:59:21 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator INFO: HHH10001005: using driver [org.postgresql.Driver] at URL [jdbc:postgresql://localhost:5432/postgres] окт 01, 2021 12:59:21 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator INFO: HHH10001001: Connection properties: {user=postgres, password=****} окт 01, 2021 12:59:21 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator INFO: HHH10001003: Autocommit mode: false окт 01, 2021 12:59:21 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PooledConnections INFO: HHH000115: Hibernate connection pool size: 20 (min=1) окт 01, 2021 12:59:22 PM org.hibernate.dialect.Dialect INFO: HHH000400: Using dialect: org.hibernate.dialect.PostgreSQL10Dialect окт 01, 2021 12:59:22 PM org.hibernate.search.engine.Version INFO: HSEARCH000034: Hibernate Search 5.5.7.Final окт 01, 2021 12:59:22 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PoolState stop INFO: HHH10001008: Cleaning up connection pool [jdbc:postgresql://localhost:5432/postgres] Exception in thread "JavaFX Application Thread" java.lang.RuntimeException: java.lang.reflect.InvocationTargetException at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1774) at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1657) at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86) at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238) at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191) at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59) at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58) at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74) at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49) at javafx.event.Event.fireEvent(Event.java:198) at javafx.scene.Node.fireEvent(Node.java:8411) at javafx.scene.control.Button.fire(Button.java:185) at com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.java:182) at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:96) at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:89) at com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:218) at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80) at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238) at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191) at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59) at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58) at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74) at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54) at javafx.event.Event.fireEvent(Event.java:198) at javafx.scene.Scene$MouseHandler.process(Scene.java:3757) at javafx.scene.Scene$MouseHandler.access$1500(Scene.java:3485) at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1762) at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2494) at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:394) at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:295) at java.security.AccessController.doPrivileged(Native Method) at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$2(GlassViewEventHandler.java:432) at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:410) at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:431) at com.sun.glass.ui.View.handleMouseEvent(View.java:555) at com.sun.glass.ui.View.notifyMouse(View.java:937) at com.sun.glass.ui.win.WinApplication._runLoop(Native Method) at com.sun.glass.ui.win.WinApplication.lambda$null$4(WinApplication.java:187) at java.lang.Thread.run(Thread.java:748) Caused by: java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at sun.reflect.misc.Trampoline.invoke(MethodUtil.java:71) at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at sun.reflect.misc.MethodUtil.invoke(MethodUtil.java:275) at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1769) ... 48 more Caused by: java.lang.NullPointerException at myapp.dao.OtdelenieDao.save(OtdelenieDao.java:12) at myapp.controllers.LoginController.onCancel(LoginController.java:65) ... 58 more Исключение: [Ljava.lang.StackTraceElement;@10eb8e40


Ответы (0 шт):