Spring+JPA如何集成Hibernate
这篇文章主要介绍Spring+JPA如何集成Hibernate,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
1.JPA简介
Java Persistence API (JPA),为开发人员提供了一种对象/关系映射(O-R Mapping)工具,用来管理 Java 应用中的关系数据。JPA是EJB3.0的一部分,现在公认为ORM行业标准。JPA本身只是一个规范,而不是产品; 它本身不能进行持续性或其他任何东西。JPA只是一组接口,需要一个实现。JPA允许通过标准的XML格式和注解格式声明,用于定义Java类如何映射到关系数据库表的映射规则。。JPA也定义了在对数据库中的对象处理查询和事务运行时的EntityManager的API。JPA定义一个对象级查询语言,JPQL,以允许从所述数据库中的对象的查询。JPA常用的解决方案:
EclipseLink (Eclipse)
Hibernate (RedHat)
Open JPA (Apache)
DataNucleus
Ebean (SourceForge)
TopLink Essentials (Glassfish)
TopLink (Oracle)
Kodo (Oracle)
JPA 规范也不是一成不变的。从2006年的JPA1.0,到2009年JPA2.0,最后到2013年JPA2.1。版本之间的特性具体参照
https://en.wikibooks.org/wiki/Java_Persistence/What_is_JPA%3F
https://en.wikipedia.org/wiki/Java_Persistence_API
2.Spring Hibernate JPA整合
准备
表CREATETABLE`Employee`(`id`int(11)unsignedNOTNULL,`name`varchar(20)DEFAULTNULL,`role`varchar(20)DEFAULTNULL,PRIMARYKEY(`id`))ENGINE=InnoDBDEFAULTCHARSET=utf8;
2.1项目结构
2.2 pom.xml
<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.springframework</groupId><artifactId>gs-relational-data-access</artifactId><version>0.1.0</version><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency><groupId>com.h3database</groupId><artifactId>h3</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency></dependencies><repositories><repository><id>spring-releases</id><name>SpringReleases</name><url>https://repo.spring.io/libs-release</url></repository><repository><id>org.jboss.repository.releases</id><name>JBossMavenReleaseRepository</name><url>https://repository.jboss.org/nexus/content/repositories/releases</url></repository></repositories><pluginRepositories><pluginRepository><id>spring-releases</id><name>SpringReleases</name><url>https://repo.spring.io/libs-release</url></pluginRepository></pluginRepositories><dependencyManagement><dependencies><dependency><groupId>io.spring.platform</groupId><artifactId>platform-bom</artifactId><version>1.1.2.RELEASE</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement></project>
使用了platform-bom,方便了包的依赖管理。
依赖树结构
2.3 persistence.xml
<persistenceversion="2.1"xmlns="http://xmlns.jcp.org/xml/ns/persistence"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistencehttp://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"><persistence-unitname="JPAExamples"><provider>org.hibernate.jpa.HibernatePersistenceProvider</provider></persistence-unit></persistence>
2.4 spring.xml
<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/schema/p"xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-3.1.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-3.1.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-3.1.xsd"><!--数据源--><beanid="dataSource"class="org.springframework.jdbc.datasource.DriverManagerDataSource"><propertyname="url"value="jdbc:mysql://localhost:3306/exampledb"/><propertyname="username"value="root"/><propertyname="password"value="root"/><propertyname="driverClassName"value="com.mysql.jdbc.Driver"/></bean><beanid="entityManagerFactory"class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"><propertyname="dataSource"ref="dataSource"/><propertyname="persistenceXmlLocation"value="META-INF/persistence.xml"/><propertyname="persistenceUnitName"value="JPAExamples"/><propertyname="jpaVendorAdapter"ref="jpaVendorAdapter"/><propertyname="jpaDialect"ref="jpaDialect"/><propertyname="jpaProperties"><props><propkey="hibernate.show_sql">true</prop></props></property></bean><beanid="jpaVendorAdapter"class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"><propertyname="generateDdl"value="false"/><propertyname="database"value="MYSQL"/></bean><beanid="jpaDialect"class="org.springframework.orm.jpa.vendor.HibernateJpaDialect"/><beanid="entityManager"factory-bean="entityManagerFactory"factory-method="createEntityManager"></bean><!--Jpa事务管理器--><beanid="transactionManager"class="org.springframework.orm.jpa.JpaTransactionManager"p:entityManagerFactory-ref="entityManagerFactory"/><!--开启注解事务--><tx:annotation-driventransaction-manager="transactionManager"proxy-target-class="true"/><!--启动对@AspectJ(面向切面)注解的支持--><aop:aspectj-autoproxy/><context:component-scanbase-package="com.journaldev.spring.jpa"></context:component-scan></beans>
有的对象,不是必须的。为了保持完整性,做了保留。
可以配置entityManagerFactory的packagesToScan属性,没有配置也是可以的。
2.5 entity
packagecom.journaldev.spring.jpa.model;importjavax.persistence.Entity;importjavax.persistence.Id;@EntitypublicclassEmployee{@Idprivateintid;privateStringname;privateStringrole;publicintgetId(){returnid;}publicvoidsetId(intid){this.id=id;}publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.name=name;}publicStringgetRole(){returnrole;}publicvoidsetRole(Stringrole){this.role=role;}@OverridepublicStringtoString(){return"{ID="+id+",Name="+name+",Role="+role+"}";}}
2.6 接口
publicinterfaceEmployeeDAO{//Createpublicvoidsave(Employeeemployee);//ReadpublicEmployeegetById(intid);//Updatepublicvoidupdate(Employeeemployee);//DeletepublicvoiddeleteById(intid);//GetAllpublicList<Employee>getAll();}
实现类
packagecom.journaldev.spring.jpa.dao;importcom.journaldev.spring.jpa.model.Employee;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Repository;importjavax.persistence.EntityManager;importjavax.persistence.PersistenceContext;importjavax.persistence.criteria.CriteriaBuilder;importjavax.persistence.criteria.CriteriaQuery;importjavax.transaction.Transactional;importjava.util.List;/***Createdbyzhaoguoyuon2016/6/22.*/@Transactional@RepositorypublicclassEmployeeDAOImplimplementsEmployeeDAO{@PersistenceContextEntityManagerem;@Overridepublicvoidsave(Employeeemployee){em.persist(employee);}@OverridepublicEmployeegetById(intid){returnem.find(Employee.class,id);}publicvoidupdate(Employeeemployee){em.merge(employee);}@OverridepublicvoiddeleteById(intid){em.remove(this.getById(id));}@OverridepublicList<Employee>getAll(){CriteriaBuilderbuilder=em.getCriteriaBuilder();finalCriteriaQuery<Employee>query=builder.createQuery(Employee.class);returnthis.em.createQuery(query).getResultList();}}
2.7测试
测试类
importcom.journaldev.spring.jpa.dao.EmployeeDAO;importcom.journaldev.spring.jpa.model.Employee;importorg.junit.Test;importorg.junit.runner.RunWith;importorg.springframework.test.context.ContextConfiguration;importorg.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringContextTests;importorg.springframework.test.context.junit4.SpringJUnit4Cla***unner;importjavax.annotation.Resource;importjava.util.Random;/***Createdbyzhaoguoyuon2016/6/22.*/@RunWith(SpringJUnit4Cla***unner.class)@ContextConfiguration(locations="classpath:spring.xml")publicclassSpringJPATestextendsAbstractTransactionalJUnit4SpringContextTests{@ResourceprivateEmployeeDAOemployeeDAO;@TestpublicvoidtestSave(){Employeeemp=newEmployee();intrand=newRandom().nextInt(1000);emp.setId(rand);emp.setName("Pankaj");emp.setRole("JavaDeveloper");employeeDAO.save(emp);}@TestpublicvoidtestUpdate(){Employeeemp=newEmployee();intrand=newRandom().nextInt(1000);emp.setId(rand);emp.setName("Pankaj");emp.setRole("JavaDeveloper");employeeDAO.save(emp);emp.setName(emp.getName()+"_update");employeeDAO.update(emp);}}
OR
importcom.journaldev.spring.jpa.dao.EmployeeDAO;importcom.journaldev.spring.jpa.model.Employee;importorg.springframework.context.support.ClassPathXmlApplicationContext;importjava.util.Random;/***Createdbyzhaoguoyuon2016/6/22.*/publicclassMain{publicstaticvoidmain(String[]args){ClassPathXmlApplicationContextctx=newClassPathXmlApplicationContext("spring.xml");finalEmployeeDAOemployeeDAO=ctx.getBean(EmployeeDAO.class);Employeeemp=newEmployee();intrand=newRandom().nextInt(1000);emp.setId(rand);emp.setName("Pankaj");emp.setRole("JavaDeveloper");employeeDAO.save(emp);Employeeemployee=employeeDAO.getById(rand);employee.setName(employee.getName()+"_update");employeeDAO.update(employee);}}
有一点需要说明。默认使用的日志是logback.号称比log4j更优秀的一款。
默认的日志配置logback.xml
<?xmlversion="1.0"encoding="UTF-8"?><configuration><appendername="STDOUT"class="ch.qos.logback.core.ConsoleAppender"><layoutclass="ch.qos.logback.classic.PatternLayout"><Pattern>%d{yyyy-MM-ddHH:mm:ss}[%thread]%-5level%logger{36}-%msg%n</Pattern></layout></appender><loggername="org.hibernate"level="debug"additivity="false"><appender-refref="STDOUT"/></logger><rootlevel="error"><appender-refref="STDOUT"/></root></configuration>
以上是“Spring+JPA如何集成Hibernate”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注亿速云行业资讯频道!
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。