Spring SpringMVC JPA整合配置

1. 三大框架

ssh

struts spring hibernate
Struts2 Spring Hibernate

ssm(目前最流行的框架)

SpringMVC Spring MyBatis

ssj(Spring springMvc jpa)

Struts2 Spring JPA(过时)
SpringMVC Spring JPA(今天集成的框架)
SpringMVC Spring spring Data JPA(spring的全家桶)

​ 第一个项目:

  • sssj–>springmvc+spring+springjdbc

    第二个项目: ssdj(结构 中小型的项目)

  • springmvc +spring +springdatajpa

    第三个项目: ssm (现在比较流行结构)

  • springmvc+spring+mybatis

    第四个项目:

  • springboot+springcloud + ssm

SSJ(框架整合)

整合流程:

导包(所有需要的jar包) -> domain(配置实体类)->
db.properties(配置连接数据库需要的资源文件) ->
datasource(配置连接数据库) ->
entityManagerFactory(配置实体管理对象工厂) ->
tx(配置事务) ->dao(配置持久层) -> service(配置业务层,Spring的配置) -> controller(springmvc的配置,web.xml) -> easyui(页面展示数据)

spring项目管理专家,所有的bean都可以交给spring管理

(1)先整合 spring和jpa

导入依赖包:

需要的包
spring-web Spring对于web的支持
spring-webmvc 引入SpringMVC的支持
spring-jdbc Spring连接数据库的包
spring-orm Spring集成ORM[对象,关系,映射]框架需要引入这个包
hibernate-core hibernate的核心包
hibernate-entitymanager hiberante对象jpa的支持包
mysql-connector-java 数据库驱动包
commons-dbcp 引入dbcp连接池的包
spring-test spring的测试包
Aspectjweaver 引入aop的织入包(切面)
jackson-databind SpringMVC返回JSON需要的包

配置pom.xml文件导包:


<project xmlns="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.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0modelVersion>



    <groupId>cn.itsourcegroupId>
    <artifactId>ssjartifactId>
    <version>1.0-SNAPSHOTversion>

    <dependencies>
        
        <dependency>
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-webartifactId>
            <version>4.2.5.RELEASEversion>
        dependency>


        
        <dependency>
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-webmvcartifactId>
            <version>4.2.5.RELEASEversion>
        dependency>
        
        <dependency>
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-jdbcartifactId>
            <version>4.2.5.RELEASEversion>
        dependency>


        
        <dependency>
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-ormartifactId>
            <version>4.2.5.RELEASEversion>
        dependency>

         
        <dependency>
            <groupId>org.hibernategroupId>
            <artifactId>hibernate-coreartifactId>
            <version>4.3.8.Finalversion>
        dependency>

        
        <dependency>
            <groupId>org.hibernategroupId>
            <artifactId>hibernate-entitymanagerartifactId>
            <version>4.3.8.Finalversion>
        dependency>
        
        <dependency>
            <groupId>mysqlgroupId>
            <artifactId>mysql-connector-javaartifactId>
            <version>5.1.6version>
        dependency>
        
        <dependency>
            <groupId>commons-dbcpgroupId>
            <artifactId>commons-dbcpartifactId>
            <version>1.2.2version>
        dependency>


        
        <dependency>
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-testartifactId>
            <version>4.2.5.RELEASEversion>
        dependency>
        
        <dependency>
            <groupId>org.aspectjgroupId>
            <artifactId>aspectjweaverartifactId>
            <version>1.8.9version>
        dependency>
        
        <dependency>
            <groupId>com.fasterxml.jackson.coregroupId>
            <artifactId>jackson-databindartifactId>
            <version>2.6.5version>
        dependency>
        
        <dependency>
            <groupId>junitgroupId>
            <artifactId>junitartifactId>
            <version>4.11version>
            <scope>testscope>
        dependency>
    dependencies>

project>

​jdbc.properties:连接数据库所需要的资源配置文件

 //建议前面都加上jdbc底层就是根据这个前缀去找的(不加上需要多一个配置) 
 // 而且这个 username 和window底层的名字一样会发生冲突
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql:///ssj
jdbc.username=root
jdbc.password=123456

配置文件applicationContext.xml Spring核心配置文件

dataSource(连接池)–》EntityManagerFactory–》EntityManager -->事务


<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">

    
    <context:component-scan base-package="cn.itsource">context:component-scan>
    
<context:property-placeholder location="classpath*:jdbc.properties">context:property-placeholder>
    
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
          
          
        <property name="driverClassName" value="${jdbc.driverClassName}">property>
           
        <property name="url" value="${jdbc.url}">property>
          
        <property name="username" value="${jdbc.username}">property>
        
        <property name="password" value="${jdbc.password}">property>
    bean>

    
    

    <bean id="entityManagerFactory"
          class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        
        <property name="dataSource" ref="dataSource">property>
        
        <property name="packagesToScan" value="cn.itsource.domain">property>
       
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                
                <property name="showSql" value="true">property>
                
                <property name="generateDdl" value="true">property>
                
                <property name="databasePlatform" value="org.hibernate.dialect.MySQLDialect">property>
            bean>
        property>


    bean>
  

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory">property>
    bean>

    
    <tx:annotation-driven/>
beans>

整合 spring和springmvc
​ 配置 web.xml和applicationContext-mvc.xml里面配置


applicationContext.xml SprtingMVC 核心配置文件



<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/mvc
       http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    
    <context:component-scan base-package="cn.itsource.web.controller">context:component-scan>
    
    <mvc:default-servlet-handler/>
    
    <mvc:annotation-driven/>
    
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/views/">property>
        <property name="suffix" value=".jsp">property>
    bean>
beans>

配置WEB.xml











    
    
        contextConfigLocation
        classpath:applicationContext.xml
    

    
    
        org.springframework.web.context.ContextLoaderListener
    



    
    
        openEntityManagerInViewFilter
        org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter
    
    
        openEntityManagerInViewFilter
        /*
    




    
    
        characterEncoding
        org.springframework.web.filter.CharacterEncodingFilter
        
            encoding
            UTF-8
        
        
            forceEncoding
            true
        
    
    
        characterEncoding
        /*
    


    
    
        dispatcherServlet
        org.springframework.web.servlet.DispatcherServlet
        
            contextConfigLocation
            classpath:applicationContext-mvc.xml
        
        1
    
    
        dispatcherServlet
        /
    




propagation:事务传播机制

属性:
REQUIRED(默认配置):如果调用我的方法是有事务的,那么我们就使用同一 个事务
REQUIRES_NEW: 不管谁调用我,我都会开一个自己的新事务
NEVER: 绝对不开事务,看到事务就报错给你看
SUPPORTS: 支持(调用我的方法有事务,就有,如果没有事务,就算了)

关于事务的配置Servce层

// 表示交给srping管理
@Service
/*在真实的使用场景里面还是查询居多 所以设计事务比较少
 所以总体设置为 SUPPORTS 支持(调用我的方法有事务,就有,如果没有事务,就算了)
 readOnly = true 在将事务设置成只读后,相当于将数据库设置成只读数据库,
 此时若要进行写的操作,会出现错误
 注意是一次执行多次查询来统计某些信息,这时为了保证数据整体的一致性,要用只读事务  
*/
@Transactional(propagation = Propagation.SUPPORTS,readOnly = true)
public class ProductDirServiceImpl  implements IProductDirService {
      // 注入值
     @Autowired
     private  IProductDirDao dirDao;
// 增删改需要开启事务  REQUIRED(默认配置):如果调用我的方法是有事务的,那么我们就使用同一 个事务
@Transactional(propagation = Propagation.REQUIRED)
    public void save(ProductDir Dir) {
        dirDao.save(Dir);

    }
    @Transactional(propagation = Propagation.REQUIRED)
    public void update(ProductDir Dir) {
             dirDao.updete( Dir);
    }
    @Transactional(propagation = Propagation.REQUIRED)
    public void deleteById(Long id) {
dirDao.delit(id);

    }

    public ProductDir queryOne(Long id) {
        return dirDao.queryOne(id);
    }

    public List queryAll() {
        return dirDao.queryAll();
    }
}

dao层得到 private EntityManager 的注解不能使用@Autowired

通过持久化上下文得到entityManager
@PersistenceContext
​ private EntityManager entityManager;

domain注意点

 // 多对以  设置懒加载
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name="dir_id")
    //忽略延迟加载额外生成的handler这个属性
   @JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})

为什么出现懒加载延迟加载报错的情况:

报错译文 无法序列化
HTTP状态500 -无法写入内容:无法初始化代理-没有会话(通过引用链:java.util.ArrayList [0] - > cn.itsource.domain.Product [1 - > cn.itsource.domain“dir”。$ jvst3de嵌套异常是com.fasterxml.jackson.databind。JsonMappingException:无法初始化代理没有会话(通过引用链:java.util.ArrayList[01->cn.itsource.domain. product ’ dir ’ 1->cn.itsource.domain。产品目录$$ ivst3de
报错原因:
当我们使用迫切加载的时候 底层是把所有的关联数据都查询出来所以当我们使用josn格 式返回数据到界面的时候拿到的是所有的数据 所以不会出现问题、
可我们设置为懒加载的时候 底层只会查询你当前请求查询的数据当你拿到数据通过json格式返回数据到界面的时候 他发现你还有一个属性没有值(比如你学生对应的老师类 当你查询学生的时候 所对应的老师在懒加载的时候没有查询出来 但是你返回josn格式的时候也要处理这个属性) 需要再次加载实体对象 但是此时连接池已经关闭了 当你第一次查询结束后且提交事务 此时的实体对象状态处于一个游离状态 连接池已经关闭

过滤器底层 拦截所有的请求当全部结束后 才关闭资源 (此时就不会提前关闭的情况了)

  if (!participate) {
            EntityManagerHolder emHolder = (EntityManagerHolder)TransactionSynchronizationManager.unbindResource(emf);
            if (!this.isAsyncStarted(request)) {
                this.logger.debug("Closing JPA EntityManager in OpenEntityManagerInViewFilter");
                EntityManagerFactoryUtils.closeEntityManager(emHolder.getEntityManager());
            }

报错译文
无法写入内容:没有为类找到序列化器org.hibernate.proxy.pojo.javassist。没有发现用于创建BeanSerializer的属性(为了避免异常,禁用SerializationFeature。(通过参考链:java.util.ArrayList [O] - > cn.itsource.domain.Product [1 - > cn.itsource.domain“dir”。ProductDir_ j v s t 7 b a 嵌 套 异 常 是 c o m . f a s t e r x m l . j a c k s o n . d a t a b i n d 。 J s o n M a p p i n g E x c e p t i o n : 没 有 为 o r g . h i b e r n a t e . p r o x y . p o j o . j a v a s s i s t 类 找 到 序 列 化 器 。 没 有 发 现 用 于 创 建 B e a n S e r i a l i z e r 的 属 性 ( 为 了 避 免 异 常 , 禁 用 S e r i a l i z a t i o n F e a t u r e 。 ( 通 过 参 考 链 : j a v a . u t i l . A r r a y L i s t r o 1 − > 1 − > c n . i t s o u r c e . d o m a i n c n . i t s o u r c e . d o m a i n . P r o d u c t r 迪 尔 ” 。 产 品 目 录 _jvst7ba嵌套异常是com.fasterxml.jackson.databind。JsonMappingException:没有为org.hibernate.proxy.pojo.javassist类找到序列化器。没有发现用于创建BeanSerializer的属性(为了避免异常,禁用SerializationFeature。(通过参考链:java.util.ArrayListro1 - > 1 - > cn.itsource.domain cn.itsource.domain.Productr迪尔”。产品目录 jvst7bacom.fasterxml.jackson.databindJsonMappingException:org.hibernate.proxy.pojo.javassistBeanSerializer(SerializationFeature(:java.util.ArrayListro1>1>cn.itsource.domaincn.itsource.domain.Productrivst7ba
为什么加上拦截器的配置后之后还会报错
当我们懒加载的底层是使用代理模式的 底层会给你新建一个子类但是该子类中会新增出来一个属性 “handler” 所以会报错

你可能感兴趣的:(框架)