Создание и связка сущностей в Hibernate

Пытаюсь написать небольшую программу. Есть список отделений (таблица otdelenie). Есть список врачей (таблица doctors). Записи из таблицы otdelenie не ссылаются на записи из таблицы doctors, а вот doctors ссылаются на одно из отделение. Классы описывающие таблицы приведены ниже. Нужны ли связки один ко многим или многие к одному?

Дело в том, что при открытии окна с врачами мне не нужно подгружать его отделение, и наоборот при загрузке отделений - список врачей не нужно подгружать. Это я буду делать в классах Dao получая id отделения или врача

Класс Otdelenie:

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

    public Otdelenie(String text) {
        this.text = text;
    }

    public Integer getId() {
        return id;
    }

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

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }
}

Класс Doctors:

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

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

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

    public int getOtdelenie_id() {
        return otdelenie_id;
    }

    public void setOtdelenie_id(int otdelenie_id) {
        this.otdelenie_id = otdelenie_id;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer 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> getOtdelenieWithid(int id) {
        List<Otdelenie> list = (List<Otdelenie>) HibernateSessionFactoryUtil.getSessionFactory().openSession()
                .createQuery("FROM Otdelenie WHERE id = :id")
                .setParameter("id", id)
                .list();

        return list;
    }

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

        return list;
    }

    public List<Otdelenie> getTypePayerList() {
        List<Otdelenie> list = (List<Otdelenie>) HibernateSessionFactoryUtil.getSessionFactory().openSession()
                .createQuery("FROM Otdelenie otd WHERE otd.id = 1")
                .list();

        return list;
    }

    public Otdelenie findOtdelenieTypePayerByCode(int code) {
        Otdelenie Otdelenie = (Otdelenie) HibernateSessionFactoryUtil.getSessionFactory().openSession()
                .createQuery("from Otdelenie otd where otd.id = 1 and otd.code = :code")
                .setParameter("code", code)
                .getSingleResult();

        return Otdelenie;
    }

    public int getMaxCode(int id) {
        Integer maxCode = (Integer) HibernateSessionFactoryUtil.getSessionFactory().openSession()
                .createQuery("select max(code) from Otdelenie where id = :id")
                .setParameter("id", id).getSingleResult();

        if (maxCode == null) {
            maxCode = 0;
        }

        return maxCode;
    }
}

При открытии формы с отделениями, ругается на метод:

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

    return list;
}

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

Автор решения: Roman C

Можете поставить связку @ManyToOne на поле otdelenie_id.

@ManyToOne
@JoinColumn
private Otdelenie otdelenie;

Вот что можно сказать по этому поводу:

Вот что можно сказать про @ManyToOne аннотацию.

Определяет однозначную связь с другим сущностным классом, который имеет множественную множественность. Обычно нет необходимости указывать целевой объект явно, поскольку он обычно может быть выведен из типа объекта, на который делается ссылка. Если отношение является двунаправленным, сторона, не владеющая @OneToMany, должна использовать элемент mappedBy, чтобы указать поле отношения или свойство объекта, являющегося владельцем отношения.

Поскольку вы создаете сущность вручную, то у нее еще нет связи и поэтому такая сущность не представляет множественности. Для того, чтобы вывести целевой обект его не надо указывать, а нужно загрузить, тогда владеющая сторона будет учитывать тип объекта при сохранении, на который делается ссылка.

Что можно сказать по поводу аннотации @JoinColumn:

Задает столбец для присоединения к ассоциации сущностей или коллекции элементов. Если сама аннотация @JoinColumn задана по умолчанию, предполагается, что используется один столбец соединения, и применяются значения по умолчанию.

По умолчанию (применяется только в том случае, если используется один столбец соединения): объединение следующего: имя ссылающегося свойства отношения или поля ссылающейся сущности или встраиваемого кключа + _ + имя указанного столбца первичного ключа. Если в сущности нет такого свойства или поля отношения ссылки, или если объединение предназначено для коллекции элементов, имя столбца объединения формируется как объединение следующих элементов: имя сущности + _ + имя указанного столбца первичного ключа.

→ Ссылка