原標題:Spring認證中國教育管理中心-Spring Data Neo4j教程一(Spring中國教育管理中心) 5. 開始我們?yōu)?SDN 提供了 Spring Boot 啟動器。請通過您的依賴管理包含啟動模塊并配置要使用的螺栓 URL,例如org.neo4j.driver.uri=bolt://localhost:7687. 啟動器假定服務(wù)器已禁用身份驗證。由于 SDN 啟動器依賴于 Java 驅(qū)動程序的啟動器,因此有關(guān)配置的所有內(nèi)容在此處也適用。有關(guān)可用屬性的參考,請使用org.neo4j.driver命名空間中的 IDE 自動完成功能或查看專用手冊。 SDN支持
這些都包含在同一個二進制文件中。反應(yīng)式編程模型在數(shù)據(jù)庫端需要 4.0 Neo4j 服務(wù)器,另一方面需要反應(yīng)式 Spring。 5.1準備數(shù)據(jù)庫對于這個例子,我們停留在movie graph 中,因為它隨每個 Neo4j 實例免費提供。 如果您沒有正在運行的數(shù)據(jù)庫但安裝了 Docker,請運行: 清單 1. 在 Docker 中啟動一個本地 Neo4j 實例。 docker run --publish=7474:7474 --publish=7687:7687 -e 'NEO4J_AUTH=neo4j/secret' neo4j:4.3.6 您現(xiàn)在可以訪問http://localhost:7474。上面的命令將服務(wù)器的密碼設(shè)置為secret. :play movies請注意在提示符 ( )中準備好運行的命令。執(zhí)行它以用一些測試數(shù)據(jù)填充您的數(shù)據(jù)庫。 5.2.創(chuàng)建一個新的 Spring Boot 項目設(shè)置 Spring Boot 項目的最簡單方法是start. (它也集成在主要 IDE 中,以防您不想使用該網(wǎng)站)。 選擇“Spring Web Starter”以獲取創(chuàng)建基于 Spring 的 Web 應(yīng)用程序所需的所有依賴項。Spring Initializr 將負責為您創(chuàng)建一個有效的項目結(jié)構(gòu),其中包含所選構(gòu)建工具的所有文件和設(shè)置。 5.2.1使用 Maven您可以針對 Spring Initializer 發(fā)出curl請求以創(chuàng)建基本的 Maven 項目: 清單 2. 使用 Spring Initializr 創(chuàng)建一個基本的 Maven 項目 curl https://start./starter.tgz -d dependencies=webflux,actuator,data-neo4j -d bootVersion=2.5.3 -d baseDir=Neo4jSpringBootExample -d name=Neo4j%20SpringBoot%20Example | tar -xzvf - 這將創(chuàng)建一個新文件夾Neo4jSpringBootExample。由于這個啟動器還沒有在初始化器上,您必須手動將以下依賴項添加到您的pom.xml: 清單 3. 在 Maven 項目中包含 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-neo4j</artifactId></dependency> 如果是現(xiàn)有項目,您還可以手動添加依賴項。 5.2.2.使用 Gradle思路是一樣的,只是生成一個Gradle項目: 清單 4. 使用 Spring Initializr 創(chuàng)建一個基本的 Gradle 項目 curl https://start./starter.tgz -d dependencies=webflux,actuator,data-neo4j -d type=gradle-project -d bootVersion=2.5.3 -d baseDir=Neo4jSpringBootExampleGradle -d name=Neo4j%20SpringBoot%20Example | tar -xzvf - Gradle 的依賴項如下所示,必須添加到build.gradle: 清單 5. 在 Gradle 項目中包含 dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-neo4j'} 如果是現(xiàn)有項目,您還可以手動添加依賴項。 5.3.配置項目現(xiàn)在在您最喜歡的 IDE 中打開這些項目中的任何一個。查找application.properties并配置您的 Neo4j 憑據(jù): spring.neo4j.uri=bolt://localhost:7687spring.neo4j.authentication.username=neo4jspring.neo4j.authentication.password=secret 這是連接到 Neo4j 實例所需的最低限度。 使用此啟動器時,無需添加驅(qū)動程序的任何編程配置。此啟動器將自動啟用 SDN 存儲庫。 5.4.在模塊路徑上運行 (Java 9+)Spring Data Neo4j 可以在模塊路徑上運行。它的自動模塊名稱是spring.data.neo4j. 由于當前 Spring Data 構(gòu)建設(shè)置的限制,它本身不提供模塊。因此,它使用自動但穩(wěn)定的模塊名稱。但是,它確實依賴于模塊化庫(Cypher-DSL)。由于module-info.java上述限制,我們無法代表您表達對該庫的要求。 因此,module-info.java您的項目中在模塊路徑上運行 Spring Data Neo4j 6.1+ 所需的最低要求如下: 清單 6.module-info.java項目中的 A 應(yīng)該在模塊路徑上使用 Spring Data Neo4j module your.module { requires org.neo4j.cypherdsl.core; requires spring.data.commons; requires spring.data.neo4j; opens your.domain to spring.core; exports your.domain; } Spring Data Neo4j 使用 Spring Data Commons 及其反射功能,因此您spring.core至少需要打開域包。 我們假設(shè)這里your.domain還包含存儲庫:必須導(dǎo)出這些存儲庫才能被 spring.beans,spring.context和訪問spring.data.commons。如果您不想將它們導(dǎo)出到世界,您可以將它們限制在這些模塊中。 5.5.創(chuàng)建您的域我們的領(lǐng)域?qū)討?yīng)該完成兩件事:
5.5.1示例節(jié)點實體SDN 完全支持 Java 和dataKotlin 中的類的不可修改實體。因此,我們將在這里關(guān)注不可變實體,清單 7顯示了這樣一個實體。 SDN 支持 Neo4j Java 驅(qū)動程序支持的所有數(shù)據(jù)類型,請參閱“Cypher 類型系統(tǒng)”一章中將Neo4j 類型映射到本地語言類型。未來的版本將支持額外的轉(zhuǎn)換器。 清單 7. MovieEntity.java import java.util.ArrayList;import java.util.List;import org.springframework.data.neo4j.core.schema.Id;import org.springframework.data.neo4j.core.schema.Node;import org.springframework.data.neo4j.core.schema.Property;import org.springframework.data.neo4j.core.schema.Relationship;import org.springframework.data.neo4j.core.schema.Relationship.Direction;@Node("Movie") public class MovieEntity { @Id private final String title; @Property("tagline") private final String description; @Relationship(type = "ACTED_IN", direction = Direction.INCOMING) private List<Roles> actorsAndRoles; @Relationship(type = "DIRECTED", direction = Direction.INCOMING) private List<PersonEntity> directors = new ArrayList<>(); public MovieEntity(String title, String description) { this.title = title; this.description = description; } // Getters omitted for brevity} @Node用于將此類標記為托管實體。它還用于配置 Neo4j 標簽。如果您只是使用 plain ,標簽?zāi)J為類的名稱@Node。 每個實體都必須有一個 id。此處顯示的電影類使用該屬性title作為唯一的業(yè)務(wù)鍵。如果您沒有這樣的唯一密鑰,您可以使用 和 的組合@Id來@GeneratedValue 配置 SDN 以使用 Neo4j 的內(nèi)部 id。我們還提供 UUID 的生成器。 這顯示@Property了為字段使用與圖形屬性不同的名稱的一種方式。 這定義了一個關(guān)系到一個類的類型PersonEntity和關(guān)系類型ACTED_IN 這是您的應(yīng)用程序代碼要使用的構(gòu)造函數(shù)。 作為一般評論:使用內(nèi)部生成的 id 的不可變實體有點矛盾,因為 SDN 需要一種方法來使用數(shù)據(jù)庫生成的值設(shè)置字段。 如果您找不到好的業(yè)務(wù)密鑰或不想使用生成器生成 ID,這里是使用內(nèi)部生成的 id 以及常規(guī)構(gòu)造函數(shù)和所謂的wither -Method 的同一實體,SDN 使用該方法: 清單 8. MovieEntity.java import org.springframework.data.neo4j.core.schema.GeneratedValue;import org.springframework.data.neo4j.core.schema.Id;import org.springframework.data.neo4j.core.schema.Node;import org.springframework.data.neo4j.core.schema.Property;import org.springframework.data.annotation.PersistenceConstructor;@Node("Movie")public class MovieEntity { @Id @GeneratedValue private Long id; private final String title; @Property("tagline") private final String description; public MovieEntity(String title, String description) { this.id = null; this.title = title; this.description = description; } public MovieEntity withId(Long id) { if (this.id.equals(id)) { return this; } else { MovieEntity newObject = new MovieEntity(this.title, this.description); newObject.id = id; return newObject; } } } 這是您的應(yīng)用程序代碼要使用的構(gòu)造函數(shù)。它將 id 設(shè)置為 null,因為不應(yīng)操縱包含內(nèi)部 id 的字段。 這就是所謂的-屬性凋零id。它創(chuàng)建一個新實體并相應(yīng)地設(shè)置字段,而不修改原始實體,從而使其不可變。 您當然可以將 SDN 與Kotlin一起使用,并使用 Kotlin 的數(shù)據(jù)類對您的域進行建模。 如果您想或需要純粹地留在 Java 中,Project Lombok是一個替代方案。 5.5.2.聲明 Spring Data 存儲庫您在這里基本上有兩個選擇:您可以使用 SDN 以與商店無關(guān)的方式工作,并使您的域特定擴展之一
相應(yīng)地選擇命令式和反應(yīng)式。 雖然技術(shù)上不禁止,但不建議在同一個應(yīng)用程序中混合命令式和反應(yīng)式數(shù)據(jù)庫訪問。我們不會在這種情況下為您提供支持。 另一種選擇是選擇特定于商店的實現(xiàn)并獲得我們開箱即用的所有方法。這種方法的優(yōu)點也是它最大的缺點:一旦出來,所有這些方法都將成為您 API 的一部分。大多數(shù)時候,拿走東西比事后添加東西更難。此外,使用商店細節(jié)會將您的商店泄漏到您的域中。從性能的角度來看,沒有懲罰。 適合上述任何電影實體的反應(yīng)式存儲庫如下所示: 清單 9. MovieRepository.java import reactor.core.publisher.Mono;import org.springframework.data.neo4j.repository.ReactiveNeo4jRepository;public interface MovieRepository extends ReactiveNeo4jRepository<MovieEntity, String> { Mono<MovieEntity> findOneByTitle(String title); } 測試響應(yīng)式代碼是使用 |
|