Не могу добавить запись в таблицу Hibernate
Пытаюсь реализовать добавление записи в таблицу sotrudnik через Hibernate. Таблица sotrudnik связана с таблицей otdel по полю otdelenie_id. При добавлении выходит ошибка:
Could not determine type for: models.Otdel, at table: sotrudnik, for columns: [org.hibernate.mapping.Column(otdel)]
С чем это связано, что не так я настроил?
Класс Sotrudnik.class
@Entity
@Table(name = "sotrudnik")
public class Sotrudnik {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@Column
private String fio;
@Column
private int otdelenie_id;
private Otdel otdel;
public Sotrudnik() { }
public Sotrudnik(String fio, int otdelenie_id) {
this.fio = fio;
this.otdelenie_id = otdelenie_id;
}
@ManyToOne
@JoinColumn(name = "otdelenie_id")
public Otdel getOtdel() {
return otdel;
}
public void setOtdel(Otdel otdel) { this.otdel = otdel; }
public int getId() { return id; }
public void setId(int id) { this.id = id; }
public String getFio() { return fio; }
public void setFio(String fio) { this.fio = fio; }
public int getOtdelenie_id() { return otdelenie_id; }
public void setOtdelenie_id(int otdelenie_id) { this.otdelenie_id = otdelenie_id; }
}
Класс Otdel.class
@Entity
@Table(name = "otdel")
public class Otdel {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@Column
private String text;
private List<Sotrudnik> sotrudnikList = new ArrayList<Sotrudnik>();
@OneToMany(mappedBy = "otdel")
public List<Sotrudnik> getSotrudnikList() {
return sotrudnikList;
}
public void setSotrudnikList(List<Sotrudnik> sotrudnikList) { this.sotrudnikList = sotrudnikList; }
public Otdel() { }
public Otdel(String text) { this.text = text; }
public String getText() { return text; }
public void setText(String text) { this.text = text; }
public int getId() { return id; }
public void setId(int id) { this.id = id; }
}
Класс OtdelDao
public class OtdelDao {
public void save(Otdel otdel) {
Session session = HibernateSessionFactoryUtil.getSessionFactory().openSession();
Transaction transaction = session.beginTransaction();
session.save(otdel);
transaction.commit();
session.close();
}
}
Класс SotrudnikDao
public class SotrudnikDao {
public void save(Sotrudnik s) {
Session session = HibernateSessionFactoryUtil.getSessionFactory().openSession();
Transaction transaction = session.beginTransaction();
session.save(s);
transaction.commit();
session.close();
}
}
Main.class
public class Main {
public static void main(String[] args) {
Sotrudnik sotrudnik = new Sotrudnik("Test", 1);
SotrudnikDao sotrudnikDao = new SotrudnikDao();
sotrudnikDao.save(sotrudnik);
}
}
StackTrace:
org.hibernate.MappingException: Could not determine type for: models.Otdel, at table: sotrudnik, for columns: [org.hibernate.mapping.Column(otdel)]
at org.hibernate.mapping.SimpleValue.getType(SimpleValue.java:512)
at org.hibernate.mapping.SimpleValue.isValid(SimpleValue.java:479)
at org.hibernate.mapping.Property.isValid(Property.java:227)
at org.hibernate.mapping.PersistentClass.validate(PersistentClass.java:625)
at org.hibernate.mapping.RootClass.validate(RootClass.java:267)
at org.hibernate.boot.internal.MetadataImpl.validate(MetadataImpl.java:354)
at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:307)
at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:471)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:728)
at utils.HibernateSessionFactoryUtil.getSessionFactory(HibernateSessionFactoryUtil.java:23)
at dao.SotrudnikDao.save(SotrudnikDao.java:10)
at start.Main.main(Main.java:13)
Exception in thread "main" java.lang.NullPointerException
at dao.SotrudnikDao.save(SotrudnikDao.java:10)
at start.Main.main(Main.java:13)
Ответы (2 шт):
В данном случае Вам не нужно у сотрудника поле private private int otdelenie_id;
Вместо этого напишите
@ManyToOne
@JoinColumn(name = "otdelenie_id")
private Otdel otdel;
https://www.baeldung.com/jpa-join-column - вот тут почитайте
Создание сотрудника подразумевает наличие отдела, так как сотрудника без отдела просто быть не может. А вот отдел может быть без сотрудников (не наняли и т.п.).
Поэтому сначала создайте отдел, а затем уже сотрудника.