純Spring方式使用spring-data-neo4j

筆者以spring-data-neo4j-5.0.5爲例,側重使用純spring的方式使用neo4j實現圖庫的增刪改查。

spring-boot的方式網上資料很多,不是筆者今天的關注點,因爲大部分工作spring-boot都做好了,開發者要做的很少。

這裏簡單使用一個domain,和一個repository模擬一個節點插入的場景。

節點定義

AssetNodeNeo.java

@NodeEntity
@Getter
@Setter
@RequiredArgsConstructor
public class AssetNodeNeo {
    @Id
    @GeneratedValue
    private Long id;
    private Long assetId;
    private String logicName;
    private String physicsName;
    private Long storageId;
    private long modifyTime;
    
    public AssetNodeNeo(Long assetId, String logicName, String physicsName, Long storageId, long modifyTime) {
        this.assetId = assetId;
        this.logicName = logicName;
        this.physicsName = physicsName;
        this.storageId = storageId;
        this.modifyTime = modifyTime;
    }
}

持久層定義

AssetNodeRepository.java

public interface AssetNodeRepository extends Neo4jRepository<AssetNodeNeo,Long>,CustomizedRepository {
}

這裏繼承Neo4jRepository,既spring-data-neo4j-4.x的GraphRepository,對增刪改查做好了封裝,相當於關係型的jdbcTemplate。

邏輯層定義

TestService.java

@Service
public class TestService {
    @Autowired
    private AssetNodeRepository assetNodeRepository;
    public void createNode() {
        AssetNodeNeo a1 = new AssetNodeNeo(257L, "a1", "a1", 6L,
            System.currentTimeMillis());
        assetNodeRepository.save(a1);
    }
}

筆者模擬的邏輯很簡單,加載spring容器,然後使用TestService將a1節點插入圖庫中。
下面分別使用java config和xml兩種方式來實現:

java config方式運行

neo4j配置:

@Configuration
@ComponentScan(basePackages = {"com.yq.service"})
@EnableNeo4jRepositories(basePackages = "com.yq.repository")
public class Neo4jConfiguration {

    @Bean
    public org.neo4j.ogm.config.Configuration configuration() {
        Neo4jProperties properties = new Neo4jProperties();
        properties.setUri("bolt://localhost:7688");
        properties.setUsername("neo4j");
        properties.setPassword("123123");
        org.neo4j.ogm.config.Configuration configuration = properties.createConfiguration();
        return configuration;
    }

    @Bean
    public SessionFactory sessionFactory(org.neo4j.ogm.config.Configuration configuration) {
        return new SessionFactory(configuration, "com.yq.domain");
    }

    @Bean
    public Neo4jTransactionManager transactionManager(SessionFactory sessionFactory) {
        return new Neo4jTransactionManager(sessionFactory);
    }
}

@Configuration 生命這是一個spring配置類
@ComponentScan(basePackages = {“com.yq.service”}) 掃描邏輯層的所有service
@EnableNeo4jRepositories(basePackages = “com.yq.repository”) 掃描neo4j的持久層
分別聲明瞭session工廠、事物管理器等3個bean,和官網類似

啓動類:

public class SpringApplication {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Neo4jConfiguration.class);

        TestService testService = context.getBean(TestService.class);
        testService.createNode();
        context.stop();
    }
}

xml方式運行

xml配置:

spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:context="http://www.springframework.org/schema/context"
    xmlns:neo4j="http://www.springframework.org/schema/data/neo4j"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://www.springframework.org/schema/beans"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/data/neo4j
        http://www.springframework.org/schema/data/neo4j/spring-neo4j.xsd">

    <context:component-scan base-package="com.yq"/>

    <bean id="sessionFactory" class="com.yq.conf.Neo4jSessionFactory" factory-method="getSessionFactory">
        <constructor-arg name="uri" value="bolt://localhost:7688"/>
        <constructor-arg name="username" value="neo4j"/>
        <constructor-arg name="password" value="123123"/>
        <constructor-arg name="domainPackage" value="com.yq.domain"/>
    </bean>

    <bean id="transactionManager" class="org.springframework.data.neo4j.transaction.Neo4jTransactionManager">
        <constructor-arg ref="sessionFactory"/>
    </bean>

    <neo4j:repositories base-package="com.yq.repository"/>
</beans>

<context:component-scan base-package=“com.yq”/> 掃描業務層
<neo4j:repositories base-package=“com.yq.repository”/>掃描neo4j持久層
分別聲明瞭session工廠、事物管理器2個bean,和java config方式類似

由於org.neo4j.ogm.session.SessionFactory構造方法入參比較複雜,這裏筆者封裝了Neo4jSessionFactory靜態工廠方法用於構造sessionFactory對象,具體如下:
Neo4jSessionFactory.java

@Setter
public class Neo4jSessionFactory {

    /**
     * Create instance of  {@link SessionFactory}.
     *
     * @param uri URI used by the driver. Auto-detected by default.
     * @param username Login user of the server.
     * @param password Login password of the server.
     * @param domainPackage The packages to scan for domain objects.
     */
    public static SessionFactory getSessionFactory(String uri, String username, String password, String domainPackage) {
        Neo4jProperties properties = new Neo4jProperties();
        properties.setUri(uri);
        properties.setUsername(username);
        properties.setPassword(password);
        org.neo4j.ogm.config.Configuration configuration = properties.createConfiguration();
        return new SessionFactory(configuration, domainPackage);
    }
}

啓動類:

public class SpringApplication {

    public static void main(String[] args) {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
            "classpath:spring.xml");

        TestService testService = context.getBean(TestService.class);
        testService.createNode();
        context.stop();
    }
}

上面兩種方式經測試皆可行,執行後,查看圖庫:
在這裏插入圖片描述


參考文檔:
spring-data-neo4j

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章