JPA子记录添加了两次

时间:2017-01-24 23:13:44

标签: ajax jsf jpa

我有一个列出Parent项的数据表。其中一列嵌套另一个表以列出Children。同样在嵌套子数据表旁边的这一列中,我有Primeface commandButton在该项上插入一个子项。我还有另一个列,每行都有另一个Primeface commandButton来切换父节点上的确认布尔值。

如果我第一次执行add child操作,那么表格会被刷新,我会看到新的子记录。如果我然后按下另一个按钮来更新我刚刚添加子记录的同一父项上的已确认布尔值,表格会刷新正常,布尔标志会正确更新,我仍然会看到添加的子项。但实际上,第二次jpa更新再次添加了子记录。在我的浏览器上刷新之前,我没有在表中看到重复的子记录。

这是一些代码

public class Parent implements Serializable {
    private boolean confirmed;

    @OneToMany(fetch = FetchType.EAGER, mappedBy = "parent", cascade = CascadeType.ALL)
    @OrderBy("date")
    private Set<Child> children;


public class Child implements Serializable {
    @ManyToOne(fetch = FetchType.LAZY)
    private Parent parent;


public class Bean
public void applyAddChild() {
    newChild.setDate(new Date());
    newChild.setParent(selectedParent);
    selectedParent.getChildren().add(newChild);

    try {
        service.update(selectedParent);
        Messages.addFlashMessage("Insert Successful");
    } catch (Exception e) {
        Messages.addFlashErrorMessage(e.getMessage());
    }

    newChild = new Child();
}


public void confirmSelected() {
    selectedParent.setConfirmed(true);
    try {
        service.update(selectedParent);
        Messages.addFlashMessage("Confirmed For Parent");
    } catch (Exception e) {
            Messages.addFlashErrorMessage(e.getMessage());
    }
}

当我放置断点并调试确认的选定方法时,子节点被列为PersistentSets

这是确认的按钮

<p:commandButton action="#{bean.confirmSelected()}" 
    rendered="#{not parent.confirmed}" value="Confirm?" update="@form">
    <f:setPropertyActionListener value="#{parent}" 
    target="#{bean.selectedParent}" />
</p:commandButton>


添加子按钮

<p:commandButton oncomplete="PF('addChildDialogWv').show()" 
    update="@form" value="Add Child">
    <f:setPropertyActionListener value="#{parent}" 
    target="#{bean.selectedParent}" />
</p:commandButton>


如果我在浏览器中点击刷新,那么所有的ajax刷新工作就好了。我想我不能使用ajax并进行完全重定向/刷新,但我想知道为什么它不能与Ajax一起使用。

修改

我能够解决我的问题,但我不确定这是一种创可贴还是正确的方法。我明确地在数据表列表中交换更新的对象。

新代码--->


public class Bean
    public void applyAddChild() {
        newChild.setDate(new Date());
        newChild.setParent(selectedParent);
        selectedParent.getChildren().add(newChild);

--->    Parent updatedParent = new Parent();
        try {
--->        updatedParent = service.update(selectedParent);
            Messages.addFlashMessage("Insert Successful");
        } catch (Exception e) {
            Messages.addFlashErrorMessage(e.getMessage());
        }

--->    int index = parents.indexOf(selectedParent);
--->    parents.set(index, updatedParent);

        newChild = new Child();
}

0 个答案:

没有答案