我对关联的依赖有一些问题,这是我的代码:
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:我是法国人,对不起我的英语。答案 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相关问题:您无法在迭代时修改集合,至少不能使用当前方法。您需要使用Iterator
和Iterator#remove()
。