当前位置: 首页 > 面试题库 >

如何使Spring Data Neo4j和Spring Data JPA协同工作?

祁彬
2023-03-14
问题内容

我有一个应用程序,它使用MySQL和通过REST的Neo4j服务器版本执行一些批处理作业。

我无法弄清楚如何使它们正确地协同工作:我可以使它们两个同时工作,但不能同时工作。我发现的帖子并非特定于Neo4j的服务器版本,也许就是问题所在,因为其他一切对我来说似乎都不错。

我的配置:

JpaConfig

@Configuration
@EnableTransactionManagement(order=Ordered.HIGHEST_PRECEDENCE)
@PropertySource("META-INF/database.properties")
@ImportResource("classpath*:META-INF/repository.xml")
public class JpaConfig {
@Autowired
Environment env;

@Bean(destroyMethod = "close")
public DataSource dataSource() {
    DataSource dataSource = new DataSource();
    dataSource.setDriverClassName(env.getProperty("database.driverClassName"));
    dataSource.setUrl(env.getProperty("database.url"));
    dataSource.setUsername(env.getProperty("database.username"));
    dataSource.setPassword(env.getProperty("database.password"));
    dataSource.setTestOnBorrow(true);
    dataSource.setTestOnReturn(true);
    dataSource.setTestWhileIdle(true);
    dataSource.setTimeBetweenEvictionRunsMillis(1800000);
    dataSource.setNumTestsPerEvictionRun(3);
    dataSource.setMinEvictableIdleTimeMillis(1800000);
    dataSource.setValidationQuery("SELECT 1");
    return dataSource;
}

@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
    LocalContainerEntityManagerFactoryBean entityManagerFactory = new LocalContainerEntityManagerFactoryBean();
    entityManagerFactory.setDataSource(dataSource());
    entityManagerFactory.setPackagesToScan("it.smartblue.mcba.domain");
    entityManagerFactory.setJpaDialect(new HibernateJpaDialect());
    Map<String, String> jpaProperties = new HashMap<>();
    jpaProperties.put("hibernate.connection.charSet", "UTF-8");
    jpaProperties.put("hibernate.ejb.naming_strategy", "org.hibernate.cfg.EJB3NamingStrategy");
    jpaProperties.put("hibernate.bytecode.provider", "javassist");
    jpaProperties.put("hibernate.dialect", "org.hibernate.dialect.MySQL5InnoDBDialect");
    entityManagerFactory.setJpaPropertyMap(jpaProperties);
    entityManagerFactory.setPersistenceProvider(new HibernatePersistence());
    return entityManagerFactory;
}

@Bean
public PlatformTransactionManager transactionManager() {
    JpaTransactionManager transactionManager = new JpaTransactionManager();
    transactionManager.setEntityManagerFactory(entityManagerFactory().getObject());
    return transactionManager;
}

@Bean
public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
    return new PersistenceExceptionTranslationPostProcessor();
}
}

Neo4j.xml

<!-- neo4j configuration -->
<neo4j:config graphDatabaseService="graphDatabaseService" entityManagerFactory="entityManagerFactory"/>
<bean id="graphDatabaseService" class="org.springframework.data.neo4j.rest.SpringRestGraphDatabase">
    <constructor-arg index="0" value="http://192.168.11.186:7474/db/data" />
</bean>
<neo4j:repositories base-package="it.smartblue.mcba.neo4j.repository" />

通过这种配置,Mysql可以完美工作,但是Neo4j不会将任何属性保存到它创建的节点上。

如果删除属性entityManagerFactory="entityManagerFactory"Neo4j可以工作,但无法写入MySQL。

我的服务方法用@Transactional或注释@Neo4jTransactional,不能同时使用。

在我发现org.springframework.data.neo4j.rest.SpringRestGraphDatabasegraphDatabaseServicebean
的类中:

@Override
public Transaction beginTx() {
    // return super.beginTx();
    return new NullTransaction();
}

@Override
public TransactionManager getTxManager() {
    return new NullTransactionManager();
}

也许这是一个正在进行的工作?也许我想念某事…

我正在使用Spring 3.1.2,Hibernate 4.1.4。这是我的pom.xml的一部分。

<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-jpa</artifactId>
    <version>1.2.0.RC1</version>
</dependency> 
  <!-- Neo4j dependencies -->
    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-neo4j</artifactId>
        <version>2.1.0.RC4</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-neo4j-rest</artifactId>
        <version>2.1.0.RC4</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-neo4j-cross-store</artifactId>
        <version>2.1.0.RC4</version>
    </dependency>

问题答案:

终于我做到了。

不再有两个不同的transactionManager,现在只有一个ChainedTransactionManager

我从JpaConfigneo4j.xml文件中删除了transactionManager bean ,并添加了以下Neo4jConfig

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.neo4j.config.EnableNeo4jRepositories;
import org.springframework.data.neo4j.config.JtaTransactionManagerFactoryBean;
import org.springframework.data.neo4j.config.Neo4jConfiguration;
import org.springframework.data.neo4j.rest.SpringRestGraphDatabase;
import org.springframework.data.neo4j.transaction.ChainedTransactionManager;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.transaction.PlatformTransactionManager;

@EnableNeo4jRepositories(basePackages = { "it.smartblue.mcba.neo4j.repository" })
@Configuration
public class Neo4jConfig extends Neo4jConfiguration {

    @Autowired
    LocalContainerEntityManagerFactoryBean entityManagerFactory;

    @Bean
    public SpringRestGraphDatabase graphDatabaseService() {
        return new SpringRestGraphDatabase("http://192.168.11.186:7474/db/data");
    }

    @Override
    @Bean(name = "transactionManager")
    public PlatformTransactionManager neo4jTransactionManager() throws Exception {
        return new ChainedTransactionManager(new JpaTransactionManager(entityManagerFactory.getObject()),
                new JtaTransactionManagerFactoryBean(graphDatabaseService()).getObject());
    }
}

现在我只能在方法上使用@Transactional注释



 类似资料:
  • 问题内容: 我很难让这些组件正确地编织在一起。我已经安装了Spark并且可以成功工作,我可以在本地,独立运行作业,也可以通过YARN运行作业。据我所知,我已经按照此处和此处建议的步骤进行操作 我正在使用Ubuntu,而我拥有的各种组件版本是 Spark Spark 1.5.1-bin-hadoop2.6 Hadoop hadoop-2.6.1 蒙哥 2.6.10 *从 https://github

  • 我的项目中的三个模型对象(本文末尾的模型和存储库片段)之间确实存在关系。 当我调用时,它会触发三个select查询: (“sql”) (对我来说)那是相当不寻常的行为。在阅读Hibernate文档后,我认为它应该始终使用连接查询。当类中的更改为时,查询没有区别(使用附加选择进行查询),当更改为时,城市类的查询也一样(使用JOIN进行查询)。 当我使用抑制火灾时,有两种选择: 我的目标是在所有情况下

  • 我不明白InputStream、InputStreamReader和BufferedReader到底是做什么的。它们都有一个read()方法,对于BufferedReader,还有readLine()。为什么我不能只使用InputStream或者只添加inputStreamReader呢?为什么我需要添加BufferedReader?我知道这与效率有关,但我不明白怎么做。 我一直在研究Buffer

  • 我计划开发一个Java的网络应用程序,它将有大量集成的视频(原始内容)从我们的后端流式传输。我很难透过树木看到森林:我希望所有非媒体、客户端内容(超文本标记语言、CSS、JS等)从我的Tomcat服务器提供,但我希望媒体内容(视频)从像Red5或Wowza这样的实际媒体服务器提供。 所以我的问题是:在后端,如何对从两台服务器(Tomcat和媒体服务器)返回内容?

  • 问题内容: 我们有一个带有postgres枚举的postgres数据库。我们开始在应用程序中构建JPA。我们也有Java枚举,它反映了postgres枚举。现在最大的问题是如何让JPA一方面理解Java枚举,另一方面理解Postgres枚举?Java方面应该很容易,但是我不确定如何进行postgres方面。 问题答案: 这涉及进行多个映射。 首先,JDBC驱动程序将Postgres枚举作为PGOb

  • 问题内容: 我想要双向JSON到Java的序列化 我正在 成功 使用Java到JSON到jQuery的路径…()例如 在JQuery中,我使用 这 很好用 (例如,感谢所有回答者,注释已经可以使用了) 但是,我该如何做 反向 路径:是否已使用RequestBody将JSON序列化回Java对象? 无论我尝试什么,我都无法像这样工作: 我已经正确配置了Jackson(它在出局时进行序列化),并且我将