Hibernate,Persistence和delation of association

时间:2010-08-16 11:47:47

标签: java hibernate orm persistence

我对关联的依赖有一些问题,这是我的代码:

  

Classe ModuleVersion

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

Classe SuiteVersion

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

我希望能够自动删除带有删除关联的suiteVersion或moduleVersion。例如,如果我删除带有此代码的SuiteVersion,则会自动删除SuiteVersion与ModuleVersion的关联。但是,如果我删除了一个moduleVersion,它不会自动删除SuiteVersion的关联 - &gt;的ModuleVersion。可以使用ModuleVersion自动执行此操作吗?

更新

  

这是hibernate执行的操作,如果我删除了一个添加CASCADETYPE.REMOVE的模块......

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=?

我只是希望执行部分无法执行。 提前感谢您的帮助,

UPDATE2

我尝试使用此方法实现删除模块:

    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

致以最诚挚的问候,

弗洛朗。

P.S:我是法国人,对不起我的英语。

1 个答案:

答案 0 :(得分:2)

  

谢谢你的回答。但如果我有这个。 suiteVersion也被删除了。我只想要关联suiteVersion表中的行 - &gt; 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相关问题:您无法在迭代时修改集合,至少不能使用当前方法。您需要使用IteratorIterator#remove()

相关问题