Java 如何在JPA中级联更新

Java 如何在JPA中级联更新,java,jsf,jpa,glassfish,ejb-3.0,Java,Jsf,Jpa,Glassfish,Ejb 3.0,我在尝试使一个多个级联事件正常工作时遇到了困难。我浏览过类似的帖子,但与其他帖子相比,我看不出我的代码哪里出错了 我有两个表Organization和Project,Organization是关系的所有者,两者之间有一个关系表 我正在尝试持久化一个新的项目实体,它可以有一个或多个与之关联的组织。我使用一个selectManyListbox(JSF2)让用户选择多个组织。在我尝试串联关系之前,所有这些都很好。要么只有项目得到持久化,要么持久化经理为与其关联的每个组织创建同一项目的新副本。即不同的o

我在尝试使一个多个级联事件正常工作时遇到了困难。我浏览过类似的帖子,但与其他帖子相比,我看不出我的代码哪里出错了

我有两个表OrganizationProject,Organization是关系的所有者,两者之间有一个关系表

我正在尝试持久化一个新的项目实体,它可以有一个或多个与之关联的组织。我使用一个selectManyListbox(JSF2)让用户选择多个组织。在我尝试串联关系之前,所有这些都很好。要么只有项目得到持久化,要么持久化经理为与其关联的每个组织创建同一项目的新副本。即不同的orgID和projID(不同的orgID指的是同一个projID,而不是不同的orgID)

为什么JPA在我尝试保持关系时会创建同一项目的新实例(相同的属性,除了ID之外)

我正在努力学习JPA/JSF,欢迎任何帮助。你好,克里斯

在ProjectBeanController中,我得到了用户选择的组织的正确实例

具有主键的实体对象

最后是组织外观编辑功能


解决了这个问题,并发布了重播给其他人谁可能会做同样的错误,我做了。希望没问题

问题出在项目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) {