1

我正在尝试显示一个表格,然后保存它。我正在使用 Spring + primefaces 和休眠。

问题是,当我尝试点击 URLDRS/jsf/lodi/createLodi.xhtml时,我希望它只显示创建实体的表单。但实际上发生了什么,它首先调用 saveLodi() 方法并在数据库中创建一条记录。

我不知道是什么导致它这样做。这是我的 createLodi() 方法

@Transactional(readOnly=true)
public String newLodi() {
    lodi = new Lodi();

    return "/jsf/lodi/createLodi.xhtml";
}

这里是 saveLodi()

/**
 * Save an existing Lodi entity
 * 
 */
@Transactional
public String saveLodi(Lodi lodi) {
    System.out.println("SAVELODI CALLED...........!");
    lodiService.saveLodi(lodi);
    return "/jsf/lodi/listLodis.xhtml";
}

我从菜单栏组件的菜单项中调用它,例如

    <p:menuitem value="Enter and Update 807's" url="#{LodiComponent.newLodi()}" ajax="true"/>

它有什么问题?为什么调用 save ?谁能给我一个想法?

谢谢, 塔希尔

4

1 回答 1

1

这很可能是您的事务设置方式和/或您使用的刷新模式的错误。

问题是您的 createLodi 和 saveLodi 方法之间会发生什么?当您对该实体进行 Hibernate 调用或仍有任何其他正在进行的事务时,当您将其设置为 flushmode.AUTO(这是默认设置)时,查询或提交可能会触发 flush()。

http://docs.jboss.org/hibernate/orm/3.5/javadoc/org/hibernate/FlushMode.html

干净的解决方案是以 createLody 和 saveLodi 在一个事务中的方式设置事务。因此,hibernate 将处理实体仅在事务结束时才保存在数据库中而没有任何错误或中止。此外,这将使您能够准确地按照您的需要设置交易。

于 2013-05-14T08:51:45.677 回答