在我的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中自动启动事务?隐式读取事务支持?
答案 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>