javascript
Spring Hibernate教程
1.簡介
在本文中,我們將演示如何利用最流行的ORM(對象關(guān)系映射)工具之一的Hibernate的功能 ,該工具可將面向?qū)ο蟮挠蚰P娃D(zhuǎn)換為傳統(tǒng)的關(guān)系數(shù)據(jù)庫。 Hibernate是目前最流行的Java框架之一。 由于這個(gè)原因,我們在Java Code Geeks上提供了很多教程,可以在此處找到大多數(shù)教程。
在本課中,我們將創(chuàng)建一個(gè)基于Spring Boot的簡單應(yīng)用程序,它將利用Hibernate配置和Spring Data JPA的功能。 我們將使用H2內(nèi)存數(shù)據(jù)庫。 數(shù)據(jù)庫的選擇不應(yīng)影響我們將構(gòu)建的Spring Data定義,因?yàn)檫@是Hibernate和Spring Data JPA提供的主要優(yōu)點(diǎn)。 它使我們能夠?qū)?shù)據(jù)庫查詢與應(yīng)用程序邏輯完全分開。
2.制作Spring Boot項(xiàng)目
在本課中,我們將使用最流行的Web工具之一來制作示例項(xiàng)目,并且不會(huì)從命令行執(zhí)行它,而是使用Spring Initializr 。 只需在瀏覽器中打開鏈接并進(jìn)行瀏覽即可。 要設(shè)置我們的項(xiàng)目,我們使用以下配置:
Spring Initializr配置
我們在此工具中添加了三個(gè)依賴項(xiàng):
- Web :這是一個(gè)基本的Spring依賴項(xiàng),它將與配置相關(guān)的注釋和基本注釋收集到項(xiàng)目中。
- H2 :由于我們使用內(nèi)存數(shù)據(jù)庫,因此需要這種依賴性。
- Data JPA :我們將在數(shù)據(jù)訪問層中使用Spring Data JPA。
接下來,解壓縮下載的zip項(xiàng)目并將其導(dǎo)入您喜歡的IDE。
3. Maven依賴
首先,我們需要查看該工具將哪些Maven依賴項(xiàng)添加到了我們的項(xiàng)目中,以及需要哪些其他依賴項(xiàng)。 我們將對pom.xml文件具有以下依賴性:
pom.xml
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId> </dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId> </dependency><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-search-orm</artifactId><version>5.6.1.Final</version> </dependency><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-entitymanager</artifactId> </dependency><dependency><groupId>com.h2database</groupId><artifactId>h2</artifactId><scope>runtime</scope> </dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope> </dependency></dependencies>在此處找到與Spring相關(guān)的最新依賴項(xiàng)。 我們添加了也需要執(zhí)行Hibernate搜索的依賴項(xiàng)。
請注意,我們還在此處添加了H2數(shù)據(jù)庫依賴關(guān)系及其范圍(作為運(yùn)行時(shí)),因?yàn)橐坏?yīng)用程序停止運(yùn)行,H2數(shù)據(jù)就會(huì)被沖走。 在本課程中,我們將不關(guān)注H2的實(shí)際工作原理,而將自己局限于Hibernate配置。 您可能還會(huì)看到我們?nèi)绾问褂肧pring應(yīng)用程序配置嵌入式H2控制臺 。
最后,要了解添加此依賴項(xiàng)時(shí)添加到項(xiàng)目中的所有JAR,我們可以運(yùn)行一個(gè)簡單的Maven命令,當(dāng)我們向項(xiàng)目添加一些依賴項(xiàng)時(shí),該命令使我們能夠查看項(xiàng)目的完整依賴關(guān)系樹。 這是我們可以使用的命令:
檢查依賴樹
mvn dependency:tree當(dāng)我們運(yùn)行此命令時(shí),它將向我們顯示以下依賴關(guān)系樹:
依賴樹
[INFO] --------< com.javacodegeeks.example:JCG-BootHibernate-Example >--------- [INFO] Building JCG-BootHibernate-Example 1.0-SNAPSHOT [INFO] --------------------------------[ jar ]--------------------------------- [INFO] [INFO] --- maven-dependency-plugin:2.10:tree (default-cli) @ JCG-BootHibernate-Example --- [INFO] com.javacodegeeks.example:JCG-BootHibernate-Example:jar:1.0-SNAPSHOT [INFO] +- org.springframework.boot:spring-boot-starter-data-jpa:jar:1.5.6.RELEASE:compile [INFO] | +- org.springframework.boot:spring-boot-starter:jar:1.5.6.RELEASE:compile [INFO] | | +- org.springframework.boot:spring-boot:jar:1.5.6.RELEASE:compile [INFO] | | +- org.springframework.boot:spring-boot-autoconfigure:jar:1.5.6.RELEASE:compile [INFO] | | +- org.springframework.boot:spring-boot-starter-logging:jar:1.5.6.RELEASE:compile [INFO] | | | +- ch.qos.logback:logback-classic:jar:1.1.11:compile [INFO] | | | | \- ch.qos.logback:logback-core:jar:1.1.11:compile [INFO] | | | +- org.slf4j:jul-to-slf4j:jar:1.7.25:compile [INFO] | | | \- org.slf4j:log4j-over-slf4j:jar:1.7.25:compile [INFO] | | \- org.yaml:snakeyaml:jar:1.17:runtime [INFO] | +- org.springframework.boot:spring-boot-starter-aop:jar:1.5.6.RELEASE:compile [INFO] | | +- org.springframework:spring-aop:jar:4.3.10.RELEASE:compile [INFO] | | \- org.aspectj:aspectjweaver:jar:1.8.10:compile [INFO] | +- org.springframework.boot:spring-boot-starter-jdbc:jar:1.5.6.RELEASE:compile [INFO] | | +- org.apache.tomcat:tomcat-jdbc:jar:8.5.16:compile [INFO] | | | \- org.apache.tomcat:tomcat-juli:jar:8.5.16:compile [INFO] | | \- org.springframework:spring-jdbc:jar:4.3.10.RELEASE:compile [INFO] | +- org.hibernate:hibernate-core:jar:5.0.12.Final:compile [INFO] | | +- antlr:antlr:jar:2.7.7:compile [INFO] | | \- org.jboss:jandex:jar:2.0.0.Final:compile [INFO] | +- javax.transaction:javax.transaction-api:jar:1.2:compile [INFO] | +- org.springframework.data:spring-data-jpa:jar:1.11.6.RELEASE:compile [INFO] | | +- org.springframework.data:spring-data-commons:jar:1.13.6.RELEASE:compile [INFO] | | +- org.springframework:spring-orm:jar:4.3.10.RELEASE:compile [INFO] | | +- org.springframework:spring-context:jar:4.3.10.RELEASE:compile [INFO] | | +- org.springframework:spring-tx:jar:4.3.10.RELEASE:compile [INFO] | | +- org.springframework:spring-beans:jar:4.3.10.RELEASE:compile [INFO] | | +- org.slf4j:slf4j-api:jar:1.7.25:compile [INFO] | | \- org.slf4j:jcl-over-slf4j:jar:1.7.25:compile [INFO] | \- org.springframework:spring-aspects:jar:4.3.10.RELEASE:compile [INFO] +- org.springframework.boot:spring-boot-starter-web:jar:1.5.6.RELEASE:compile [INFO] | +- org.springframework.boot:spring-boot-starter-tomcat:jar:1.5.6.RELEASE:compile [INFO] | | +- org.apache.tomcat.embed:tomcat-embed-core:jar:8.5.16:compile [INFO] | | +- org.apache.tomcat.embed:tomcat-embed-el:jar:8.5.16:compile [INFO] | | \- org.apache.tomcat.embed:tomcat-embed-websocket:jar:8.5.16:compile [INFO] | +- org.hibernate:hibernate-validator:jar:5.3.5.Final:compile [INFO] | | +- javax.validation:validation-api:jar:1.1.0.Final:compile [INFO] | | \- com.fasterxml:classmate:jar:1.3.3:compile [INFO] | +- com.fasterxml.jackson.core:jackson-databind:jar:2.8.9:compile [INFO] | | +- com.fasterxml.jackson.core:jackson-annotations:jar:2.8.0:compile [INFO] | | \- com.fasterxml.jackson.core:jackson-core:jar:2.8.9:compile [INFO] | +- org.springframework:spring-web:jar:4.3.10.RELEASE:compile [INFO] | \- org.springframework:spring-webmvc:jar:4.3.10.RELEASE:compile [INFO] | \- org.springframework:spring-expression:jar:4.3.10.RELEASE:compile [INFO] +- org.hibernate:hibernate-search-orm:jar:5.6.1.Final:compile [INFO] | \- org.hibernate:hibernate-search-engine:jar:5.6.1.Final:compile [INFO] | +- org.apache.lucene:lucene-core:jar:5.5.4:compile [INFO] | +- org.apache.lucene:lucene-misc:jar:5.5.4:compile [INFO] | +- org.apache.lucene:lucene-analyzers-common:jar:5.5.4:compile [INFO] | \- org.apache.lucene:lucene-facet:jar:5.5.4:compile [INFO] | \- org.apache.lucene:lucene-queries:jar:5.5.4:compile [INFO] +- org.hibernate:hibernate-entitymanager:jar:5.0.12.Final:compile [INFO] | +- org.jboss.logging:jboss-logging:jar:3.3.1.Final:compile [INFO] | +- dom4j:dom4j:jar:1.6.1:compile [INFO] | +- org.hibernate.common:hibernate-commons-annotations:jar:5.0.1.Final:compile [INFO] | +- org.hibernate.javax.persistence:hibernate-jpa-2.1-api:jar:1.0.0.Final:compile [INFO] | +- org.javassist:javassist:jar:3.21.0-GA:compile [INFO] | \- org.apache.geronimo.specs:geronimo-jta_1.1_spec:jar:1.1.1:compile [INFO] +- com.h2database:h2:jar:1.4.196:runtime [INFO] \- org.springframework.boot:spring-boot-starter-test:jar:1.5.6.RELEASE:test [INFO] +- org.springframework.boot:spring-boot-test:jar:1.5.6.RELEASE:test [INFO] +- org.springframework.boot:spring-boot-test-autoconfigure:jar:1.5.6.RELEASE:test [INFO] +- com.jayway.jsonpath:json-path:jar:2.2.0:test [INFO] | \- net.minidev:json-smart:jar:2.2.1:test [INFO] | \- net.minidev:accessors-smart:jar:1.1:test [INFO] | \- org.ow2.asm:asm:jar:5.0.3:test [INFO] +- junit:junit:jar:4.12:test [INFO] +- org.assertj:assertj-core:jar:2.6.0:test [INFO] +- org.mockito:mockito-core:jar:1.10.19:test [INFO] | \- org.objenesis:objenesis:jar:2.1:test [INFO] +- org.hamcrest:hamcrest-core:jar:1.3:test [INFO] +- org.hamcrest:hamcrest-library:jar:1.3:test [INFO] +- org.skyscreamer:jsonassert:jar:1.4.0:test [INFO] | \- com.vaadin.external.google:android-json:jar:0.0.20131108.vaadin1:test [INFO] +- org.springframework:spring-core:jar:4.3.10.RELEASE:compile [INFO] \- org.springframework:spring-test:jar:4.3.10.RELEASE:test [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------注意到了什么? 只需將四個(gè)依賴項(xiàng)添加到項(xiàng)目中,即可添加如此多的依賴項(xiàng)。 Spring Boot本身會(huì)收集所有相關(guān)的依賴項(xiàng),因此在此方面不做任何事情。 最大的優(yōu)點(diǎn)是,所有這些依賴項(xiàng)都可以保證彼此兼容。
4.項(xiàng)目結(jié)構(gòu)
在繼續(xù)進(jìn)行并開始處理項(xiàng)目代碼之前,讓我們在此介紹完成向項(xiàng)目添加所有代碼后將擁有的項(xiàng)目結(jié)構(gòu):
Hibernate項(xiàng)目結(jié)構(gòu)
我們將項(xiàng)目分為多個(gè)包,以便遵循關(guān)注點(diǎn)分離的原則,并且代碼保持模塊化。
請注意, indexpath目錄是由Hibernate創(chuàng)建的,用于存儲索引(在本課程的后面部分討論),當(dāng)您在IDE中導(dǎo)入項(xiàng)目時(shí),該目錄將不存在。
5.定義Hibernate方言
在application.properties文件中,我們定義了項(xiàng)目類路徑上存在的Spring Data JPA使用的兩個(gè)屬性。 Spring Boot使用Hibernate作為默認(rèn)的JPA實(shí)現(xiàn)。
application.properties
## Hibernate Properties # The SQL dialect makes Hibernate generate better SQL for the chosen database spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5InnoDBDialect# Hibernate DDL auto (create, create-drop, validate, update) spring.jpa.hibernate.ddl-auto = updatespring.jpa.hibernate.ddl-auto屬性在這里很重要。 因此,Spring Data將根據(jù)我們在項(xiàng)目中定義的實(shí)體自動(dòng)創(chuàng)建數(shù)據(jù)庫表,而列將由實(shí)體的字段構(gòu)成。 正如我們將屬性設(shè)置為update ,每當(dāng)我們更新Entity類中的字段時(shí),只要重新啟動(dòng)項(xiàng)目,該字段就會(huì)在數(shù)據(jù)庫中自動(dòng)更新。
6.定義實(shí)體
我們將在我們的項(xiàng)目中添加一個(gè)非常簡單的模型Person 。 它的定義將非常標(biāo)準(zhǔn),例如:
人.java
@Entity @Indexed public class Person {@Id@GeneratedValueprivate Long id;@Field(termVector = TermVector.YES)private String name;@Fieldprivate int age;// standard getters and setters@Overridepublic String toString() {return String.format("Person{id=%d, name='%s', age=%d}", id, name, age);} }為了簡潔起見,我們省略了標(biāo)準(zhǔn)的getter和setter方法,但是由于Jackson在對象的序列化和反序列化過程中使用它們,因此必須將它們制成。
@Entity注釋將此POJO標(biāo)記為將由Spring Data API管理的對象,并且其字段將被視為表列(除非標(biāo)記為瞬態(tài)),而@Field注釋將此字段標(biāo)記為Hibernate索引,以便我們可以在這些字段上也運(yùn)行全文搜索查詢。
最后,我們?yōu)閠oString()方法添加了一個(gè)自定義實(shí)現(xiàn),以便在測試應(yīng)用程序時(shí)可以打印相關(guān)數(shù)據(jù)。
7.制作服務(wù)接口
在本節(jié)中,我們將定義一個(gè)服務(wù)接口,該接口將充當(dāng)實(shí)現(xiàn)的合同,并代表我們的服務(wù)必須支持的所有操作。 這些動(dòng)作將與結(jié)交新用戶以及獲取與數(shù)據(jù)庫中對象有關(guān)的信息有關(guān)。
這是我們將使用的合同定義:
PersonService.java
public interface PersonService {Person createPerson(Person person);Person getPerson(Long id);Person editPerson(Person person);void deletePerson(Person person);void deletePerson(Long id);List<Person> getAllPersons(int pageNumber, int pageSize);List<Person> getAllPersons();long countPersons();List<Person> fuzzySearchPerson(String term);List<Person> wildCardSearchPerson(String term); }請注意,合同最后還包括兩種方法,它們也為Hibernate搜索提供支持。
8.實(shí)施服務(wù)
我們將使用上面的接口定義來提供其實(shí)現(xiàn),以便我們可以執(zhí)行與我們先前定義的Person實(shí)體相關(guān)的CRUD操作。 我們將在這里執(zhí)行:
PersonServiceImpl.java
@Service public class PersonServiceImpl implements PersonService {private final PersonRepository personRepository;private final PersonDAL personDAL;@Autowiredpublic PersonServiceImpl(PersonRepository personRepository, PersonDAL personDAL) {this.personRepository = personRepository;this.personDAL = personDAL;}@Overridepublic Person createPerson(Person person) {return personRepository.save(person);}@Overridepublic Person getPerson(Long id) {return personRepository.findOne(id);}@Overridepublic Person editPerson(Person person) {return personRepository.save(person);}@Overridepublic void deletePerson(Person person) {personRepository.delete(person);}@Overridepublic void deletePerson(Long id) {personRepository.delete(id);}@Overridepublic List<Person> getAllPersons(int pageNumber, int pageSize) {return personRepository.findAll(new PageRequest(pageNumber, pageSize)).getContent();}@Overridepublic List<Person> getAllPersons() {return personRepository.findAll();}@Overridepublic long countPersons() {return personRepository.count();}@Override@Transactional(readOnly = true)public List<Person> fuzzySearchPerson(String term) {return personDAL.fuzzySearchPerson(term);}@Override@Transactional(readOnly = true)public List<Person> wildCardSearchPerson(String term) {return personDAL.wildCardSearchPerson(term);} }我們只是使用DAL bean訪問我們上面定義的方法。 我們還使用了@Transactional(readOnly = true)批注,這樣我們就不必在執(zhí)行一些寫操作時(shí)就需要打開一個(gè)Hibernate會(huì)話,但是由于我們只需要執(zhí)行搜索,因此我們可以放心地提到readOnly屬性設(shè)置為true 。
9.定義JPA信息庫
由于大多數(shù)操作都是由JPA Repository本身完成的,因此在這里定義它:
PersonRepository.java
@Repository public interface PersonRepository extends JpaRepository<Person, Long> { }盡管上面的接口定義是空的,但我們?nèi)匀恍枰私庖恍┮c(diǎn):
- @Repository批注將此接口標(biāo)記為Spring Bean,該Bean在應(yīng)用程序啟動(dòng)時(shí)初始化。 有了這個(gè)注釋,Spring可以很好地管理異常數(shù)據(jù)庫的交互拋出
- 我們使用Person作為參數(shù)來表示此JPA接口將管理Person實(shí)體
- 最后,我們還傳遞了數(shù)據(jù)類型Long作為參數(shù)。 這表示Person實(shí)體包含唯一標(biāo)識符,其類型為Long。
10.定義數(shù)據(jù)訪問層(DAL)接口
盡管我們已經(jīng)定義了執(zhí)行所有CRUD操作的JPA信息庫,但我們?nèi)詫⒃贒AL層中定義用于Hibernate自由文本搜索的查詢。 讓我們看看我們定義的合同:
PersonDAL.java
public interface PersonDAL {List<Person> fuzzySearchPerson(String term);List<Person> wildCardSearchPerson(String term); }11.實(shí)現(xiàn)DAL接口
在我們定義的DAL接口中,我們將實(shí)現(xiàn)兩種不同類型的自由文本搜索:
- 模糊搜索:當(dāng)我們要查找與搜索詞相距一定距離的詞時(shí),可以使用模糊搜索。 為了理解差距,讓我們考慮一個(gè)例子。 術(shù)語Hibernate和Hibernat有1由于缺少差距e在后文中,術(shù)語Hibernate和Hibernawe還具有以下在后面的字符串即單個(gè)字符1的缺口w可以更換成原字符串。
- 通配符搜索:這些就像具有匹配短語SQL語句一樣。 像Hibernate匹配短語一樣,可以是Hiber , bernate等。
讓我們在DAL層中實(shí)現(xiàn)這兩個(gè)功能。
11.1定義模糊查詢
我們將從模糊搜索實(shí)現(xiàn)開始。 這是一個(gè)非常智能和復(fù)雜的搜索,因?yàn)檫@需要對數(shù)據(jù)庫索引中保存的每個(gè)術(shù)語進(jìn)行標(biāo)記化。 在此處閱讀有關(guān)Lucene如何做到的更多信息。
讓我們在這里實(shí)現(xiàn)此搜索查詢:
模糊查詢
@PersistenceContext private EntityManager entityManager;@Override public List<Person> fuzzySearchPerson(String term) {FullTextEntityManager fullTextEntityManager =org.hibernate.search.jpa.Search.getFullTextEntityManager(entityManager);QueryBuilder queryBuilder =fullTextEntityManager.getSearchFactory().buildQueryBuilder().forEntity(Person.class).get();Query fuzzyQuery = queryBuilder.keyword().fuzzy().withEditDistanceUpTo(2).withPrefixLength(0).onField("name").matching(term).createQuery();FullTextQuery jpaQuery =fullTextEntityManager.createFullTextQuery(fuzzyQuery, Person.class);return jpaQuery.getResultList(); }我們僅使用2的編輯距離。這是Hibernate和Lucene引擎支持的最大間隙。
11.2定義通配符查詢
通配符查詢易于理解和實(shí)現(xiàn)。 就像SQL LIKE語句一樣工作:
通配符查詢
@Overridepublic List<Person> wildCardSearchPerson(String term) {FullTextEntityManager fullTextEntityManager =org.hibernate.search.jpa.Search.getFullTextEntityManager(entityManager);QueryBuilder queryBuilder =fullTextEntityManager.getSearchFactory().buildQueryBuilder().forEntity(Person.class).get();Query wildcardQuery = queryBuilder.keyword().wildcard().onField("name").matching("*" + term + "*").createQuery();FullTextQuery jpaQuery =fullTextEntityManager.createFullTextQuery(wildcardQuery, Person.class);return jpaQuery.getResultList();}我們在術(shù)語的前后??使用* ,以便LIKE可以在兩個(gè)方向上工作。
12.在Hibernate中建立搜索索引
在Hibernate開始存儲索引數(shù)據(jù)之前,我們需要確保搜索索引確實(shí)存在。 可以通過在應(yīng)用程序啟動(dòng)后立即構(gòu)造它來完成:
BuildSearchIndex.java
@Component public class BuildSearchIndex implements ApplicationListener<ApplicationReadyEvent> {@PersistenceContextprivate EntityManager entityManager;@Overridepublic void onApplicationEvent(ApplicationReadyEvent applicationReadyEvent) {try {FullTextEntityManager fullTextEntityManager =Search.getFullTextEntityManager(entityManager);fullTextEntityManager.createIndexer().startAndWait();}catch (InterruptedException e) {System.out.println("An error occurred trying to build the serach index: " +e.toString());}return;} }盡管我們在Hibernate中構(gòu)造了一個(gè)搜索索引,但是索引數(shù)據(jù)將存儲在哪里。 接下來,我們將對其進(jìn)行配置。
13.存儲索引數(shù)據(jù)
由于Hibernate需要存儲Index數(shù)據(jù),以便不必在每次執(zhí)行操作時(shí)都重建索引數(shù)據(jù),因此我們將為Hibernate提供文件系統(tǒng)目錄,以在其中存儲此數(shù)據(jù):
application.properties
# Specify the Lucene Directory spring.jpa.properties.hibernate.search.default.directory_provider = filesystem# Using the filesystem DirectoryProvider you also have to specify the default # base directory for all indexes spring.jpa.properties.hibernate.search.default.indexBase = indexpathdirectory_provider僅提供哪種類型的系統(tǒng)將存儲數(shù)據(jù),因?yàn)槲覀兩踔量梢詫⑺饕龜?shù)據(jù)存儲到云中。
14.創(chuàng)建命令行運(yùn)行器
現(xiàn)在,我們準(zhǔn)備運(yùn)行我們的項(xiàng)目。 將樣本數(shù)據(jù)插入
DataJpaApp.java
@SpringBootApplication public class DataJpaApp implements CommandLineRunner {private static final Logger LOG = LoggerFactory.getLogger("JCG");@Autowiredprivate PersonService service;public static void main(String[] args) {SpringApplication.run(DataJpaApp.class, args);}@Overridepublic void run(String... strings) {LOG.info("Current objects in DB: {}", service.countPersons());Person person = service.createPerson(new Person("Shubham", 23));LOG.info("Person created in DB : {}", person);LOG.info("Current objects in DB: {}", service.countPersons());List<Person> fuzzySearchedPersons = service.fuzzySearchPerson("Shubha");LOG.info("Founds objects in fuzzy search: {}", fuzzySearchedPersons.get(0));List<Person> wildSearchedPersons = service.wildCardSearchPerson("hub");LOG.info("Founds objects in wildcard search: {}", wildSearchedPersons.get(0));person.setName("Programmer");Person editedPerson = service.editPerson(person);LOG.info("Person edited in DB : {}", person);service.deletePerson(person);LOG.info("After deletion, count: {}", service.countPersons());} }15.使用Maven運(yùn)行項(xiàng)目
使用maven可以輕松運(yùn)行應(yīng)用程序,只需使用以下命令:
運(yùn)行應(yīng)用程序
mvn spring-boot:run一旦運(yùn)行項(xiàng)目,我們將看到以下輸出:
運(yùn)行Hibernate項(xiàng)目
如預(yù)期的那樣,我們首先創(chuàng)建了一些樣本數(shù)據(jù),并通過調(diào)用count()方法調(diào)用對其進(jìn)行了確認(rèn)。 最后,調(diào)用搜索方法以獲得預(yù)期結(jié)果。
16.結(jié)論
在本課程中,我們研究了如何使用Hibernate配置Spring Data API,以及如何僅通過為實(shí)體定義POJO類就可以幫助我們在數(shù)據(jù)庫中自動(dòng)構(gòu)造Tables。 即使更新實(shí)體,也不必?fù)?dān)心在數(shù)據(jù)庫中進(jìn)行更改!
我們還運(yùn)行了一些Hibernate搜索示例,這些示例由Lucene引擎本身提供了用于索引的功能,而Hibernate為我們提供了有關(guān)Lucene功能的有用包裝器。
17.下載源代碼
這是Spring Boot和Hibernate ORM Framework的一個(gè)示例。
下載您可以在此處下載此示例的完整源代碼: JCG-BootHibernate-Example
翻譯自: https://www.javacodegeeks.com/2018/04/spring-hibernate-tutorial.html
總結(jié)
以上是生活随笔為你收集整理的Spring Hibernate教程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: graphql_GraphQL在Wild
- 下一篇: gradle idea java ssm