Java @交易无效

Java @交易无效,java,spring,neo4j,spring-transactions,spring-data-neo4j,Java,Spring,Neo4j,Spring Transactions,Spring Data Neo4j,我目前遇到的问题是,@Transactional注释似乎没有启动Neo4j的事务(它不适用于我的@Transactional注释方法,不仅仅适用于下面的示例) 示例: 我有一个方法(UserService.createUser),它首先在Neo4j图中创建一个用户节点,然后在MongoDB中创建用户(带有附加信息)。(MongoDB不支持事务,因此先创建用户节点,然后将实体插入MongoDB,然后提交Neo4j事务) 该方法使用@Transactional进行注释,但在neo4j中创建用户时会抛

我目前遇到的问题是,
@Transactional
注释似乎没有启动Neo4j的事务(它不适用于我的@Transactional注释方法,不仅仅适用于下面的示例)

示例:

我有一个方法(
UserService.createUser
),它首先在Neo4j图中创建一个用户节点,然后在MongoDB中创建用户(带有附加信息)。(MongoDB不支持事务,因此先创建用户节点,然后将实体插入MongoDB,然后提交Neo4j事务)

该方法使用
@Transactional
进行注释,但在neo4j中创建用户时会抛出
org.neo4j.graphdb.NotInTransactionException

这里分别介绍我的配置和编码:

基于代码的SDN-Neo4j配置:

@Configuration
@EnableTransactionManagement                        // mode = proxy
@EnableNeo4jRepositories(basePackages = "graph.repository")
public class Neo4jConfig extends Neo4jConfiguration {
    private static final String DB_PATH = "path_to.db";
    private static final String CONFIG_PATH = "path_to.properties";

    @Bean(destroyMethod = "shutdown")
    public GraphDatabaseService graphDatabaseService() {
        return new GraphDatabaseFactory().newEmbeddedDatabaseBuilder(DB_PATH)
            .loadPropertiesFromFile(CONFIG_PATH).newGraphDatabase();
    }
}
在Neo4j和MongoDB中创建用户的服务:

@Service
public class UserService {
    @Inject
    private UserMdbRepository mdbUserRepository;    // MongoRepository
    @Inject
    private Neo4jTemplate neo4jTemplate;

    @Transactional
    public User createUser(User user) {
        // Create the graph-node first, because if this fails the user
        // shall not be created in the MongoDB
        this.neo4jTemplate.save(user);              // NotInTransactionException is thrown here
        // Then create the MongoDB-user. This can't be rolled back, but
        // if this fails, the Neo4j-modification shall be rolled back too
        return this.mdbUserRepository.save(user);
    }

    ...
}
旁注:

  • 我使用的是spring版本
    3.2.3.RELEASE
    和spring-data-neo4j版本
    2.3.0.M1
  • UserService和Neo4jConfig位于单独的Maven构件中
  • 启动服务器和SDN读取操作到目前为止,我只是在写操作方面遇到了问题
  • 我目前正在将我们的项目从tinkerpop框架迁移到SDN-Neo4j。这个用户创建过程以前(使用tinkerpop)就已经成功了,我只需要使用SDN-Neo4j就可以了
  • 我正在Jetty中运行应用程序
有人知道为什么这不起作用吗

我希望这些资料足够。如果有什么遗漏,请告诉我,我会补充的


编辑:

我忘了提到手动事务处理是有效的,但我当然希望以“按原意”的方式实现它


多亏了m-deinum,我终于找到了问题所在。问题是,我在不同的spring配置文件中扫描了这些组件/服务,而不是在配置SDN-Neo4j的文件中。我将那些可能需要事务的包的组件扫描移到了我的
Neo4jConfig
,现在它可以工作了

@Configuration
@EnableTransactionManagement                        // mode = proxy
@EnableNeo4jRepositories(basePackages = "graph.repository")
@ComponentScan({
    "graph.component",
    "graph.service",
    "core.service"
})
public class Neo4jConfig extends Neo4jConfiguration {
    private static final String DB_PATH = "path_to.db";
    private static final String CONFIG_PATH = "path_to.properties";

    @Bean(destroyMethod = "shutdown")
    public GraphDatabaseService graphDatabaseService() {
        return new GraphDatabaseFactory().newEmbeddedDatabaseBuilder(DB_PATH)
            .loadPropertiesFromFile(CONFIG_PATH).newGraphDatabase();
    }
}
不过,我仍然需要将需要事务的组件/服务与不需要事务的组件/服务分开。然而,这在目前是可行的


我假设问题在于另一个spring配置文件(包括组件扫描)是在
Neo4jConfig
之前加载的,因为
neo4j:repositories
必须放在
context:component scan
之前。(参见示例20.26.Composing repositories中的注释)

您的
TransactionManager
bean在超类
org.springframework.data.neo4j.config.Neo4jConfiguration.neo4jTransactionManager()中的何处
如何创建UserService实例?你能升级到2.3.RC1吗?哦,如果您对服务器使用SDN,您不会那么高兴,可能最好主要通过Cypher使用SDN代码,或者使用SDN和嵌入式API实现服务器扩展。未来计划为远程服务器和SDN提供更好的性能。UserService将
@Inject
插入
@Controller
(与Neo4jConfig位于同一工件中)。我们所有的maven工件都在同一台服务器上运行,我们以嵌入式模式访问图形。不过,未来计划分离关注点。我会尽快升级到2.3.RC1,因为我在办公室:)你在哪里扫描你的@Service注释bean?我猜是在
DispatcherServlet
级别,而事务是在
ContextLoaderListener
上启用的。(或者您正在扫描组件两次)。发布您的配置/web.xml。。。
@Configuration
@EnableTransactionManagement                        // mode = proxy
@EnableNeo4jRepositories(basePackages = "graph.repository")
@ComponentScan({
    "graph.component",
    "graph.service",
    "core.service"
})
public class Neo4jConfig extends Neo4jConfiguration {
    private static final String DB_PATH = "path_to.db";
    private static final String CONFIG_PATH = "path_to.properties";

    @Bean(destroyMethod = "shutdown")
    public GraphDatabaseService graphDatabaseService() {
        return new GraphDatabaseFactory().newEmbeddedDatabaseBuilder(DB_PATH)
            .loadPropertiesFromFile(CONFIG_PATH).newGraphDatabase();
    }
}