“高级映射”模式下的spring-data-neo4j - 如何在不手动启动事务的情况下读取实体值?

时间:2014-10-02 10:28:56

标签: spring-data-neo4j

在我的JavaEE7项目中,我在“高级映射”模式下使用spring-data-neo4j独立(使用spring-aspects)。到目前为止一切正常:CRUD交易中的实体,手动或通过@Transactional-annotation启动交易。

在我的用例中,我的视图“直接”访问实体:

// User
@NodeEntity
public class User {

    private String firstName;

    // getter, setter, ...
}

// SessionBean
@SessionScoped
@Named
public class SessionBean {

    @Transactional
    public User getUser() {
         User user = ...;
         System.out.println(user.getFirstName()); // (1) gives firstName-value.
         return user;
    }
}

// sometpl.xhtml
${sessionBean.user.firstName} // (2) gives "null".

不知何故,这种行为((1)和(2)之间的区别)是必需的,因为spring-data-neo4j假设读取访问only within a transaction

但我想让我的usecase(2)工作(返回用户的firstName,而不是“null”)。有没有办法实现这个目标?那么让我们说,在read-access-case中自动启动事务?隐式读取事务支持?

1 个答案:

答案 0 :(得分:0)

我的解决方法:

使用RequestScoped bean在“preRenderView”中启动事务,并在bean被销毁时关闭此tx。

这不适用于ajax-calls!

@Named
@RequestScoped
public class SpringDataNeo4jHelperBean {

  @Inject
  @Named
  private Neo4jTemplate neoTemplate;

  private Transaction tx;

  @PreDestroy
  public void finishTransaction() {
    if (this.tx != null) {
        this.tx.success();
        this.tx.finish();
    }
  }

  public void startReadOnlyTransaction() {
    if (!this.neoTemplate.getGraphDatabase().transactionIsRunning()) {
        this.tx = this.neoTemplate.getGraphDatabaseService().beginTx();
    }
  }
}

在某些模板中,例如s.th.像一个中央layout.xhtml:

<f:metadata>
    <f:event type="preRenderView" listener="#{springDataNeo4jHelperBean.startReadOnlyTransaction()}" />
</f:metadata>