SpringBoot 集成JPA
1,JPA基本理论 JPA 是 JCP 组织发布的 Java EE 标准之一,因此任何声称符合 JPA 标准的框架都遵循同样的架构,提供相同的访问API,这保证了基于JPA开发的企业应用能够经过少量的修改就能够在不同的JPA框架下运行。 JPA框架中支持大数据集、事务、并发等容器级事务,这使得 JPA 超越了简单持久化框架的局限,在企业应用发挥更大的作用。
JPA的主要目标之一就是提供更加简单的编程模型:在JPA框架下创建实体和创建Java 类一样简单,没有任何的约束和限制,只需要使用 javax.persistence.Entity进行注释,JPA的框架和接口也都非常简单,没有太多特别的规则和设计模式的要求,开发者可以很容易的掌握。JPA基于非侵入式原则设计,因此可以很容易的和其它框架或者容器集成。
JPA的查询语言是面向对象而非面向数据库的,它以面向对象的自然语法构造查询语句,可以看成是Hibernate HQL的等价物。JPA定义了独特的JPQL(Java Persistence Query Language),JPQL是EJB QL的一种扩展,它是针对实体的一种查询语言,操作对象是实体,而不是关系数据库的表,而且能够支持批量更新和修改、JOIN、GROUP BY、HAVING 等通常只有 SQL 才能够提供的高级查询特性,甚至还能够支持子查询。
2,JPA如何配置
现在我们开始讲解如何通过JPA的方式来实现数据库的操作。还是跟JdbcTemplate类似,首先,我们需要引入对应的starter:
org.springframework.boot
spring-boot-starter-data-jpa
然后我们需要对POJO类增加Entity的注解,并指定表名(如果不指定,默认的表名为article),然后需要指定ID的及其生成策略,这些都是JPA的知识,与Spring boot无关,如果不熟悉的话可以看下JPA的知识点:
@Entity(name = “tb_article”)
public class Article {
@Id
@GeneratedValue
private Long id;
private String title;
private String summary;
private Date createTime;
private Date publicTime;
private Date updateTime;
private Long userId;
private Integer status;
}
最后,我们需要继承JpaRepository这个类,这里我们实现了两个查询方法,第一个是符合JPA命名规范的查询,JPA会自动帮我们完成查询语句的生成,另一种方式是我们自己实现JPQL(JPA支持的一种类SQL的查询)。
public interface ArticleRepository extends JpaRepository<Article, Long> {
public List<Article> findByUserId(Long userId); @Query("select art from com.pandy.blog.po.Article art where title=:title") public List<Article> queryByTitle(@Param("title") String title);
}
好了,我们可以再测试一下上面的代码:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = Application.class)
public class ArticleRepositoryTest {
@Autowired
private ArticleRepository articleRepository;
@Test public void testQuery(){ List<Article> articleList = articleRepository.queryByTitle("测试标题"); assertTrue(articleList.size()>0); }
}
注意,这里还是存在跟JdbcTemplate类似的问题,需要将Application这个启动类未于Respository和Entity类的父级包中,否则会出现如下错误:
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type ‘com.pandy.blog.dao.ArticleRepository’ available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1493)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1104)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1066)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:585)
… 28 more
当然,同样也可以通过注解@EnableJpaRepositories指定扫描的JPA的包,但是还是不行,还会出现如下错误:
Caused by: java.lang.IllegalArgumentException: Not a managed type: class com.pandy.blog.po.Article
at org.hibernate.jpa.internal.metamodel.MetamodelImpl.managedType(MetamodelImpl.java:210)
at org.springframework.data.jpa.repository.support.JpaMetamodelEntityInformation.(JpaMetamodelEntityInformation.java:70)
at org.springframework.data.jpa.repository.support.JpaEntityInformationSupport.getEntityInformation(JpaEntityInformationSupport.java:68)
at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getEntityInformation(JpaRepositoryFactory.java:153)
at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getTargetRepository(JpaRepositoryFactory.java:100)
at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getTargetRepository(JpaRepositoryFactory.java:82)
at org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepository(RepositoryFactorySupport.java:199)
at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.initAndReturn(RepositoryFactoryBeanSupport.java:277)
at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.afterPropertiesSet(RepositoryFactoryBeanSupport.java:263)
at org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean.afterPropertiesSet(JpaRepositoryFactoryBean.java:101)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1687)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1624)
… 39 more
这个错误说明识别不了Entity,所以还需要通过注解@EntityScan来指定Entity的包,最终的配置如下:
@SpringBootApplication
@ComponentScan({“com.pandy.blog”})
@EnableJpaRepositories(basePackages=“com.pandy.blog”)
@EntityScan(“com.pandy.blog”)
public class Application {
public static void main(String[] args) throws Exception {
SpringApplication.run(Application.class, args);
}
}
- springboot 2.X.X 和1.x.x两个版本下集成jpa报错:jdbcUrl is required with driverClassName
- 基于spring boot 1.5.4 集成 jpa+hibernate+jdbcTemplate(详解)
- Spring Boot 集成 JPA 的步骤
- 五、spring boot 1.5.4 集成 jpa+hibernate+jdbcTemplate
- spring boot 简单集成 mybatis、druid(阿里巴巴连接池)、redis、jpa
- spring-boot学习笔记(二)spring-data-jpa的简介以及项目集成
- Spring Boot 系列(九)数据层-集成Spring-data-jpa
- 简单快速的用SpringBoot集成JPA
- SpringBoot | 第三十章:Spring-data-jpa的集成和使用
- SpringBoot集成JPA的示例代码
- springboot 学习之集成JPA
- Springboot+Kotlin+Jpa集成项目
- Spring boot 集成Spring Data JPA+数据源
- spring boot 添加扫包 集成 jpa
- springboot集成hibernate-jpa方式
- spring boot 集成spring data jpa 时报错java.lang.ClassNotFoundException: org.hibernate.OptimisticLockExcep
- spring boot集成data-jpa
- spring-boot 集成jpa 持久层
- SpringBoot以及集成组件注解大全详解(一)——lomback && JPA
- springboot集成hibernate-jpa方式