Удаление объектов с ограничениями FK в Spring / Hibernate - PullRequest
1 голос
/ 28 декабря 2010

Мне кажется, что такой простой сценарий, но я не могу найти решение онлайн или в печати.У меня есть несколько объектов, таких как (обрезано):

@Entity
public class Group extends BaseObject implements Identifiable<Long> {
    private Long id;
    private String name;
    private Set<HiringManager> managers = new HashSet<HiringManager>();
    private List<JobOpening> jobs;

    @ManyToMany(fetch=FetchType.EAGER)
    @JoinTable(
            name="group_hiringManager",
            joinColumns=@JoinColumn(name="group_id"),
            inverseJoinColumns=@JoinColumn(name="hiringManager_id")
    )
    public Set<HiringManager> getManagers() {
        return managers;
    }

    @OneToMany(mappedBy="group", fetch=FetchType.EAGER)
    public List<JobOpening> getJobs() {
        return jobs;
    }
}

@Entity
public class JobOpening extends BaseObject implements Identifiable<Long> {
    private Long id;
    private String name;
    private Group group;

    @ManyToOne
    @JoinColumn(name="group_id", updatable=false, nullable=true)
    public Group getGroup() {
        return group;
    }
}

@Entity
public class HiringManager extends User {

    @ManyToMany(mappedBy="managers", fetch=FetchType.EAGER)
    public Set<Group> getGroups() {
        return groups;
    }
}

Скажем, я хочу удалить объект группы.Теперь есть зависимости от него в таблице JobOpening и в таблице group_hiringManager, которые вызывают сбой функции удаления.Я не хочу каскадно удалять, потому что у менеджеров есть другие группы, и вакансии могут быть без группы.Я попытался переопределить функцию remove () моего GroupManager для удаления зависимостей, но кажется, что независимо от того, что я делаю, они сохраняются, и удаление не удается!

Как правильно удалить этот объект?

1 Ответ

3 голосов
/ 28 декабря 2010

Перед удалением группы, переберите список открытия работы групп и установите нулевое значение в поле группы. Или напишите запрос на обновление, который обнуляет поле группы таблицы вакансий. Что-то вроде

Group group = entityManager.find(Group.class, groupId);

for (JobOpening aJob : group.getJobs()) {

     aJob.setGroup(null);
     entityManager.merge(aJob);
     entityManager.flush();
}

//Then delete group

entityManager.remove(group);

С запросом, что-то вроде,

entityManager.createQuery("update JobOpening set group = null where group.id = :groupId")
             .setParameter(groupId)
             .executeUpdate();

Затем удалите группу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...