Гибернация, Стойкость и связь - PullRequest
2 голосов
/ 16 августа 2010

У меня есть проблема с определением ассоциаций, это мой код:

Classe ModuleVersion

@ManyToMany(mappedBy="listModuleVersions")
private List<SuiteVersion> suiteVersions = new ArrayList<SuiteVersion>();

Classe SuiteVersion

@ManyToMany()
private List<ModuleVersion> listModuleVersions = new ArrayList<ModuleVersion>();*

Я хотел бы иметь возможность автоматически удалять версию пакета или версию модуля с удалением ассоциации.Например, если я удаляю SuiteVersion с этим кодом, автоматически удаляется связь SuiteVersion с ModuleVersion.Но если я удаляю moduleVersion, он автоматически не удаляет ассоциацию SuiteVersion -> ModuleVersion.Это можно сделать автоматически с помощью ModuleVersion?

Обновление

Это действие, выполняемое hibernate, если я удаляю модуль с добавлением CASCADETYPE.УДАЛИТЬ ...

Hibernate: delete from SUITE_VERSION_MODULE_VERSION where suiteVersions_ID_SUITE_VERSION=?
Hibernate: delete from SUITE_VERSION_MODULE_VERSION where suiteVersions_ID_SUITE_VERSION=?
Hibernate: delete from SUITE_VERSION_MODULE_VERSION where suiteVersions_ID_SUITE_VERSION=?
Hibernate: delete from SUITE_VERSION_MODULE_VERSION where suiteVersions_ID_SUITE_VERSION=?
Hibernate: delete from SUITE_VERSION_MODULE_VERSION where suiteVersions_ID_SUITE_VERSION=?
//Hibernate: delete from SUITE_VERSION where ID_SUITE_VERSION=?
//Hibernate: delete from SUITE_VERSION where ID_SUITE_VERSION=?
Hibernate: delete from MODULE_VERSION where ID_MODULE_VERSION=?
//Hibernate: delete from SUITE_VERSION where ID_SUITE_VERSION=?
//Hibernate: delete from SUITE_VERSION where ID_SUITE_VERSION=?
Hibernate: delete from MODULE_VERSION where ID_MODULE_VERSION=?
//Hibernate: delete from SUITE_VERSION where ID_SUITE_VERSION=?
Hibernate: delete from MODULE_VERSION where ID_MODULE_VERSION=?
Hibernate: delete from MODULE where ID_MODULE=?

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

Обновление2

Я пытался удалить модуль с помощью этого метода реализации:

    public static void removeModule(Module module) {
    for(ModuleVersion moduleVersion : module.getListModuleVersion()){
        for(SuiteVersion suiteVersion : moduleVersion.getSuiteVersions()){
            sessionFactory = HibernateFactory.getSessionFactory();
            session = sessionFactory.getCurrentSession();
            transaction = session.beginTransaction();
            suiteVersion.removeFromModuleVersions(moduleVersion);
            transaction.commit();
        }
    }
    sessionFactory = HibernateFactory.getSessionFactory();
    session = sessionFactory.getCurrentSession();
    session.delete(module);
    transaction.commit();
}

Но у меня естьэта проблема сейчас:

Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException

С наилучшими пожеланиями,

Флоран.

PS: Я француз, извините за мой английский.

1 Ответ

2 голосов
/ 16 августа 2010

Спасибо за ответ. Но если бы у меня было это. версия пакета также удаляется. Я просто хочу, чтобы строка в таблице ассоциаций suiteVersion -> moduleVersion была удалена.

Я думаю, что получил это сейчас: вы хотите разорвать ассоциацию и удалить соответствующую запись из таблицы соединений. Это не то, что я понял из исходного вопроса. Во всяком случае ...

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

session.getTransaction().begin();
SuiteVersion suite = ... // retrieved in some way
ModuleVersion module = ... // retrieved in some way
suite.getModuleVersions().remove(module);
module.getSuiteVersions().remove(suite);
session.getTransaction().commit(); // the "association" record should get removed

Но я предлагаю использовать вспомогательные методы:

@Entity
public class SuiteVersion {
    ...
    @ManyToMany
    private List<ModuleVersion> moduleVersions = new ArrayList<ModuleVersion>();

    ...

    public void removeFromModuleVersions(ModuleVersion module) {
        this.moduleVersions.remove(module);
        module.getSuiteVersions().remove(this);
    }

    public void addToModuleVersions(ModuleVersion module) {
        this.moduleVersions.add(module);
        module.getSuiteVersions().add(this);
    }

}

И тогда ваш код становится:

session.getTransaction().begin();
SuiteVersion suite = ... // retrieved in some way
ModuleVersion module = ... // retrieved in some way
suite.removeFromModuleVersions(module);
session.getTransaction().commit();

Смотри также


Обновление: Ваша «новая» проблема связана с чисто Java-проблемой: вы не можете изменять коллекцию во время ее итерации, по крайней мере, с помощью текущего подхода. Вам необходимо использовать Iterator и Iterator#remove().

Смежные вопросы

...