Ошибки при добавлении записи 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