Java 如何在JPA中级联更新
我在尝试使一个多个级联事件正常工作时遇到了困难。我浏览过类似的帖子,但与其他帖子相比,我看不出我的代码哪里出错了 我有两个表Organization和Project,Organization是关系的所有者,两者之间有一个关系表 我正在尝试持久化一个新的项目实体,它可以有一个或多个与之关联的组织。我使用一个selectManyListbox(JSF2)让用户选择多个组织。在我尝试串联关系之前,所有这些都很好。要么只有项目得到持久化,要么持久化经理为与其关联的每个组织创建同一项目的新副本。即不同的orgID和projID(不同的orgID指的是同一个projID,而不是不同的orgID) 为什么JPA在我尝试保持关系时会创建同一项目的新实例(相同的属性,除了ID之外) 我正在努力学习JPA/JSF,欢迎任何帮助。你好,克里斯 在ProjectBeanController中,我得到了用户选择的组织的正确实例 具有主键的实体对象 最后是组织外观编辑功能Java 如何在JPA中级联更新,java,jsf,jpa,glassfish,ejb-3.0,Java,Jsf,Jpa,Glassfish,Ejb 3.0,我在尝试使一个多个级联事件正常工作时遇到了困难。我浏览过类似的帖子,但与其他帖子相比,我看不出我的代码哪里出错了 我有两个表Organization和Project,Organization是关系的所有者,两者之间有一个关系表 我正在尝试持久化一个新的项目实体,它可以有一个或多个与之关联的组织。我使用一个selectManyListbox(JSF2)让用户选择多个组织。在我尝试串联关系之前,所有这些都很好。要么只有项目得到持久化,要么持久化经理为与其关联的每个组织创建同一项目的新副本。即不同的o
解决了这个问题,并发布了重播给其他人谁可能会做同样的错误,我做了。希望没问题 问题出在项目bean的create函数中。在合并(更新)组织实体之前,我必须首先对项目调用create(persist)
try {
getFacade().create(current);
for(Organisation org : current.getOrganisationCollection()) {
org.getProjectCollection().add(current);
ejbOrganisationFacade.edit(org);
}
JsfUtil.addSuccessMessage(ResourceBundle.getBundle("/resources/Bundle").getString("ProjectCreated"));
return prepareCreate();
} catch (Exception e) {
另外,我在项目facade的create方法中有一个错误,该方法调用merge而不是persist。这导致了很多问题。很抱歉为这样一个琐碎的解决方案占用了空间。您是否将Oranisations添加到当前项目中?我在你的代码中没有看到它,我想你需要这样做。谢谢你的重播。current.GetOrganizationCollection()(current=project)已将该集合与组织一起使用。我认为这是通过JSF页面中的绑定完成的,binding=“#{projectController.selectedorganizations}”。因此,如果我在组织和项目端都设置了集合,那么会出现什么问题?我将附加jsf页面。@Chris-请编辑您的问题以提供更多信息。答案是为你的问题保留的。@Chris你能公布你的bean的主键是什么吗?
@ManagedBean (name="projectController")
@SessionScoped
public class ProjectController implements Serializable {
private Project current;
private UISelectMany selectedOrganisations;
...
public String create() {
UserController userBean = JsfUtil.findBean("userController", UserController.class);
current.setUser(userBean.getSessionUser());
current.setTimeStamp(JsfUtil.getTimeStamp());
try {
//Use the OrganisationFacade, who is the owner of the relationship and uses Cascade to update the relation
for(Organisation org : current.getOrganisationCollection()) {
org.getProjectCollection().add(current);
ejbOrganisationFacade.edit(org);
}
//getFacade().create(current);
JsfUtil.addSuccessMessage(ResourceBundle.getBundle("/resources/Bundle").getString("ProjectCreated"));
return prepareCreate();
} catch (Exception e) {
JsfUtil.addErrorMessage(e, ResourceBundle.getBundle("/resources/Bundle").getString("PersistenceErrorOccured"));
return null;
}
}
public UISelectMany getSelectedOrganisations() {
return selectedOrganisations;
}
public void setSelectedOrganisations(UISelectMany selectedOrganisations) {
this.selectedOrganisations = selectedOrganisations;
}
...
}
@Override
public void edit(Organisation entity) {
getEntityManager().merge(entity);
}
try {
getFacade().create(current);
for(Organisation org : current.getOrganisationCollection()) {
org.getProjectCollection().add(current);
ejbOrganisationFacade.edit(org);
}
JsfUtil.addSuccessMessage(ResourceBundle.getBundle("/resources/Bundle").getString("ProjectCreated"));
return prepareCreate();
} catch (Exception e) {