Не могу удалить session.delete() объекты @OneToMany связанных таблиц

292
26 мая 2017, 12:35

Здравствуйте коллеги! Помогите пожалуйста разобраться с проблемкой. Есть два java класса сущности (@Entity), связанные по @OneToMany:

-Developer

@Entity
public class Developer implements Serializable{
    @Id
    @GeneratedValue(generator = "default")
    @GenericGenerator(name = "default", strategy = "seqhilo")
    private Long id;
    private String name;
    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.PERSIST)
    @JoinTable(
            name = "dev_skills",
            joinColumns = @JoinColumn(name = "dev_id"),
            inverseJoinColumns = @JoinColumn(name = "skill_id"))
    private Set<Skill> skillSet = new HashSet<>();
    private int salary;
    private int rank;
    public Developer(){
    }

-Skill

@Entity
public class Skill implements Serializable{
    @Id @Column(name = "skillId")
    @GeneratedValue(generator = "default")
    @GenericGenerator(name = "default", strategy = "seqhilo")
    private Long id;
    private String name;
    @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER, targetEntity = Developer.class)
    protected Developer developer;
    public Skill() {
    }    
}

Добавление и изменение работают хорошо, но никак не могу уйти от проблемы с удалением. Есть реализация, в которой пытаюсь удалить все умения:

Простое удаление через session.delete(Skill) не получается, т.к. сущности связаны таблицей с foreign_key'ами. Поэтому сразу летят ошибки

Пытаюсь удалить через загрузку разработчика, перебор его Set'a умений и поочередного удаления, но при загрузке (load()) разработчиков их Set'ы умений пусты, несмотря на то, что в обоих случаях использую FetchType.EAGER.

@Override
public void clear() {
    Session session = HibernateUtil.getSessionFactory().openSession();
    session.beginTransaction();
    skills = getSkillsFromDB(session);
    for (Skill skill : skills){
        Developer developer = session.load(Developer.class, skill.getId());
        Set<Skill> developerSkills = developer.getSkillSet();
        developerSkills.remove(skill);
        session.update(developer);
        session.delete(session.get(Skill.class, skill.getId()));
    }
    session.getTransaction().commit();
    session.close();
}

Подскажите пожалуйста, что делаю не так...

Answer 1

Давненько не занимался Hibernate, тем не менее:

Попробуйте в таблице Skill, в @manyToOne надо прописать @Join Column

P.S. почему у вас не совпадают идентификаторы join: skillId и skill_id?

READ ALSO
Присваивание примитиву примитив

Присваивание примитиву примитив

Допустим, есть число, которое высчитывается долгим путем, нужно создать это же числоДелал всегда такое же высчитывание для второго числа

280
Как использовать Stateless Session beans в Spring?

Как использовать Stateless Session beans в Spring?

У меня есть проект на git, который я написал в рамках прохождения лабораторных работ (лаба в которой описаны задачи, функционал и тех требования)

379
Что лучше использовать EventBus или Otto?

Что лучше использовать EventBus или Otto?

Что лучше использовать EventBus или Otto?

355
Hibernate Native SQL With Criteria

Hibernate Native SQL With Criteria

Подскажите пожалуйста как лучше всего организовать следующее

384