JPA学习笔记

笔记地址

1.orm思想

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.jpa介绍

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.案例

jpa的基本操作
	案例:是客户的相关操作(增删改查)
		客户:就是一家公司
	客户表:
	
	jpa操作的操作步骤
		1.加载配置文件创建实体管理器工厂
			Persisitence:静态方法(根据持久化单元名称创建实体管理器工厂)
				createEntityMnagerFactory(持久化单元名称)
			作用:创建实体管理器工厂
			
		2.根据实体管理器工厂,创建实体管理器
			EntityManagerFactory :获取EntityManager对象
			方法:createEntityManager
			* 内部维护的很多的内容
				内部维护了数据库信息,
				维护了缓存信息
				维护了所有的实体管理器对象
				再创建EntityManagerFactory的过程中会根据配置创建数据库表
			* EntityManagerFactory的创建过程比较浪费资源
			特点:线程安全的对象
				多个线程访问同一个EntityManagerFactory不会有线程安全问题
			* 如何解决EntityManagerFactory的创建过程浪费资源(耗时)的问题?
			思路:创建一个公共的EntityManagerFactory的对象
			* 静态代码块的形式创建EntityManagerFactory
			
		3.创建事务对象,开启事务
			EntityManager对象:实体类管理器
				beginTransaction : 创建事务对象
				presist : 保存
				merge  : 更新
				remove : 删除
				find/getRefrence : 根据id查询
				
			Transaction 对象 : 事务
				begin:开启事务
				commit:提交事务
				rollback:回滚
		4.增删改查操作
		5.提交事务
		6.释放资源
	
	i.搭建环境的过程
		1.创建maven工程导入坐标
		2.需要配置jpa的核心配置文件
			*位置:配置到类路径下的一个叫做 META-INF 的文件夹下
			*命名:persistence.xml
		3.编写客户的实体类
		4.配置实体类和表,类中属性和表中字段的映射关系
		5.保存客户到数据库中
	ii.完成基本CRUD案例
		persist : 保存
		merge : 更新
		remove : 删除
		find/getRefrence : 根据id查询
		
	iii.jpql查询
		sql:查询的是表和表中的字段
		jpql:查询的是实体类和类中的属性
		* jpql和sql语句的语法相似
		
		1.查询全部
		2.分页查询
		3.统计查询
		4.条件查询
		5.排序	

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>
<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.0</modelVersion>

    <groupId>cn.itcast</groupId>
    <artifactId>JPA-1</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.hibernate.version>5.0.7.Final</project.hibernate.version>
    </properties>

    <dependencies>
        <!-- junit -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>

        <!-- hibernate对jpa的支持包 -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>${project.hibernate.version}</version>
        </dependency>

        <!-- c3p0 -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-c3p0</artifactId>
            <version>${project.hibernate.version}</version>
        </dependency>

        <!-- log日志 -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>

        <!-- Mysql and MariaDB -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.6</version>
        </dependency>
    </dependencies>
</project>
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
    <!--需要配置persistence.unit节点
        持久化单元:
            name:持久化单元名称
            transaction-type:事务管理的方式
                RESOURCE_LOCAL:本地事务管理
                JTA:分布式事务管理 -->
    <persistence-unit name="myJpa" transaction-type="RESOURCE_LOCAL">
        <!--jpa的实现方式-->
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>

        <!--可选配置,配置jpa实现方的配置信息-->
        <properties>
            <!--数据库信息
                用户名:javax.persistence.jdbc.user
                密码:javax.persistence.jdbc.password
                驱动:javax.persistence.jdbc.driver
                数据库地址:javax.persistence.jdbc.url
            -->
            <property name="javax.persistence.jdbc.user" value="root"/>
            <property name="javax.persistence.jdbc.password" value=""/>
            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql:///g_07?characterEncoding=utf-8"/>
            <!--配置jpa实现方(hibernate)的配置信息
                显示sql   :   false|true
                自动创建数据库表    :   hibernate.nbm2ddl.auto
                    create  :   程序运行时创建数据库表(如果有表,先删除表在创建)
                    update  :   程序运行时创建表(如果有表,不会创建表)
                    none    :   不会创建表
            -->
            <property name="hibernate.show_sql" value="true"/>
            <property name="hibernate.hbm2ddl.auto" value="create"/>
        </properties>
    </persistence-unit>
</persistence>
package cn.itcast.domain;

import javax.persistence.*;
/**
 * 客户的实体类
 *      配置映射关系
 *      所有的注解都是使用JPA的规范提供的注解,
 *      所以在导入注解包的时候,一定要导入javax.persistence下的
 *      1.实体类和表的映射关系
 *          @Entity:声明实体类
 *          @Table:配置实体类和表的映射关系
 *              name:配置数据库表的名称
 *      2.实体类中属性和表中字段的映射关系
 * @Entity
 *     作用:指定当前类是实体类。
 * @Table
 *     作用:指定实体类和表之间的对应关系。
 *     属性:
 *     name:指定数据库表的名称
 * @Id
 *     作用:指定当前字段是主键。
 * @GeneratedValue
 *     作用:指定主键的生成方式。。
 *     属性:
 *     strategy :指定主键生成策略。
 * @Column
 *     作用:指定实体类属性和数据库表之间的对应关系
 *     属性:
 *     name:指定数据库表的列名称。
 *     unique:是否唯一
 *     nullable:是否可以为空
 *     inserttable:是否可以插入
 *     updateable:是否可以更新
 *     columnDefinition: 定义建表时创建此列的DDL
 *     secondaryTable: 从表名。如果此列不建在主表上(默认建在主表),该属性定义该列所在从表的名字搭建开发环境[重点]
 */
@Entity
@Table(name = "cst_customer")
public class Customer {
    /**
     * @Id:声明主键位置
     * @GeneratedValue: 配置主键的生成策略
     *      GenerationType.IDENTITY: 自增
     * @Column:配置属性和字段的映射关系
     *      name:数据库表中字段的名称
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "cust_id")
    private Long custId;//客户的主键

    @Column(name="cust_name")
    private String custName;//客户名称

    @Column(name="cust_source")
    private String custSource;//客户来源

    @Column(name="cust_industry")
    private String custIndustry;//客户所属行业

    @Column(name="cust_level")
    private String custLevel;//客户级别

    @Column(name="cust_address")
    private String custAddress;//客户地址

    @Column(name="cust_phone")
    private String custPhone;//客户的联系方式

    public Long getCustId() {
        return custId;
    }

    public void setCustId(Long custId) {
        this.custId = custId;
    }

    public String getCustName() {
        return custName;
    }

    public void setCustName(String custName) {
        this.custName = custName;
    }

    public String getCustSource() {
        return custSource;
    }

    public void setCustSource(String custSource) {
        this.custSource = custSource;
    }

    public String getCustIndustry() {
        return custIndustry;
    }

    public void setCustIndustry(String custIndustry) {
        this.custIndustry = custIndustry;
    }

    public String getCustLevel() {
        return custLevel;
    }

    public void setCustLevel(String custLevel) {
        this.custLevel = custLevel;
    }

    public String getCustAddress() {
        return custAddress;
    }

    public void setCustAddress(String custAddress) {
        this.custAddress = custAddress;
    }

    public String getCustPhone() {
        return custPhone;
    }

    public void setCustPhone(String custPhone) {
        this.custPhone = custPhone;
    }

    @Override
    public String toString() {
        return "Customer{" +
                "custId=" + custId +
                ", custName='" + custName + '\'' +
                ", custSource='" + custSource + '\'' +
                ", custIndustry='" + custIndustry + '\'' +
                ", custLevel='" + custLevel + '\'' +
                ", custAddress='" + custAddress + '\'' +
                ", custPhone='" + custPhone + '\'' +
                '}';
    }
}
package cn.itcast.test;

import cn.itcast.domain.Customer;
import org.junit.Test;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;

public class JpaTest {
    /**
     * 测试jpa的保存
     *      案例:保存一个客户到数据库表中
     * jpa的操作步骤
     *      1.加载配置文件创建工厂(实体管理器工厂)对象
     *      2.通过实体管理器工厂获取实体管理器
     *      3.获取事务对象,开启事务
     *      4.完成增删改查操作
     *      5.提交事务(回滚事务)
     *      6.释放资源
     */
    @Test
    public void testSave(){
        //加载配置文件创建工厂(实体管理器工厂)对象
        EntityManagerFactory factory = Persistence.createEntityManagerFactory("myJpa");
        //2.通过实体管理器工厂获取实体管理器
        EntityManager em = factory.createEntityManager();
        //3.获取事务对象,开启事务
        EntityTransaction tx = em.getTransaction();
        tx.begin();
        //4.完成增删改查操作
        Customer customer = new Customer();
        customer.setCustName("张三");
        customer.setCustIndustry("哈哈哈");
        //保存
        em.persist(customer);
        //5.提交事务(回滚事务)
        tx.commit();
        //6.释放资源
        em.close();
        factory.close();
    }
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.JPA中的主键生成策略

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
把原有数据库表全删除,再启动
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.抽取JPAUtil工具类

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6.使用JPA完成增删改查操作

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

7.jpql查询

查询全部
在这里插入图片描述
简写
在这里插入图片描述
在这里插入图片描述
倒序
在这里插入图片描述
在这里插入图片描述
统计查询
在这里插入图片描述
在这里插入图片描述
分页查询

 	/**
     * 分页查询
     *      jpql: from Customer
     *       sql: select * from cst_customer limit 0,2
     */
    @Test
    public void testPaged(){
        //1.获取EntityManager对象
        EntityManager em = JpaUtils.getEntityManager();
        //2.开启事务
        EntityTransaction tx = em.getTransaction();
        tx.begin();
        //3.查询全部
        //根据jpql语句创建query查询对象
        String jpql = "from Customer";
        Query query = em.createQuery(jpql);
        //对参数赋值 -- 分页参数
        //起始索引
        query.setFirstResult(0);
        //每页查询条数
        query.setMaxResults(2);
        //发送查询,并解封结果集
        //getResultList:直接将查询结果封装为list集合
        //getSingleResult:得到唯一的结果集
        List list = query.getResultList();
        for (Object obj : list) {
            System.out.println(obj);
        }
        //4.提交事务
        tx.commit();
        //5.释放资源
        em.close();
    }
log4j:WARN No appenders could be found for logger (org.jboss.logging).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
Hibernate: select customer0_.cust_id as cust_id1_0_, customer0_.cust_address as cust_add2_0_, customer0_.cust_industry as cust_ind3_0_, customer0_.cust_level as cust_lev4_0_, customer0_.cust_name as cust_nam5_0_, customer0_.cust_phone as cust_pho6_0_, customer0_.cust_source as cust_sou7_0_ from cst_customer customer0_ limit ?
Customer{custId=1, custName='李四', custSource='null', custIndustry='嘿嘿', custLevel='null', custAddress='null', custPhone='null'}
Customer{custId=2, custName='张三', custSource='null', custIndustry='哈哈哈', custLevel='null', custAddress='null', custPhone='null'}

Process finished with exit code 0

条件查询

    /**
     * 条件查询:查询客户名称以'张'开头的客户
     *      jpql: from Customer where custName like '张%'
     *       sql: select * from cst_customer where cust_name like '张%'
     */
    @Test
    public void testCondition(){
        //1.获取EntityManager对象
        EntityManager em = JpaUtils.getEntityManager();
        //2.开启事务
        EntityTransaction tx = em.getTransaction();
        tx.begin();
        //3.查询全部
        //根据jpql语句创建query查询对象
        String jpql = "from Customer where custName like ? ";
        Query query = em.createQuery(jpql);
        //对参数赋值 -- 占位符参数
        //第一个参数,占位符的索引位置(从1开始),第二个参数,取值
        query.setParameter(1,"张%");
        //发送查询,并解封结果集
        //getResultList:直接将查询结果封装为list集合
        //getSingleResult:得到唯一的结果集
        List list = query.getResultList();
        for (Object obj : list) {
            System.out.println(obj);
        }
        //4.提交事务
        tx.commit();
        //5.释放资源
        em.close();
    }

在这里插入图片描述

8.springDataJpa概述

在这里插入图片描述
在这里插入图片描述

9.案例

在这里插入图片描述
在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>
<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.0</modelVersion>

    <groupId>cn.itcast</groupId>
    <artifactId>JPA-2</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <spring.version>5.0.2.RELEASE</spring.version>
        <hibernate.version>5.0.7.Final</hibernate.version>
        <slf4j.version>1.6.6</slf4j.version>
        <log4j.version>1.2.12</log4j.version>
        <c3p0.version>0.9.1.2</c3p0.version>
        <mysql.version>5.1.6</mysql.version>
    </properties>

    <dependencies>
        <!-- junit单元测试 -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>

        <!-- spring beg -->
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.6.8</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <!--spring对orm框架的支持包-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <!-- spring end -->

        <!-- hibernate beg -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>${hibernate.version}</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>${hibernate.version}</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>5.2.1.Final</version>
        </dependency>
        <!-- hibernate end -->

        <!-- c3p0 beg -->
        <dependency>
            <groupId>c3p0</groupId>
            <artifactId>c3p0</artifactId>
            <version>${c3p0.version}</version>
        </dependency>
        <!-- c3p0 end -->

        <!-- log end -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>${log4j.version}</version>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${slf4j.version}</version>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>${slf4j.version}</version>
        </dependency>
        <!-- log end -->

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql.version}</version>
        </dependency>
        <!--spring data jpa的坐标-->
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-jpa</artifactId>
            <version>1.9.0.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <!-- el beg 使用spring data jpa 必须引入 -->
        <dependency>
            <groupId>javax.el</groupId>
            <artifactId>javax.el-api</artifactId>
            <version>2.2.4</version>
        </dependency>

        <dependency>
            <groupId>org.glassfish.web</groupId>
            <artifactId>javax.el</artifactId>
            <version>2.2.4</version>
        </dependency>
        <!-- el end -->
    </dependencies>
</project>
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:jpa="http://www.springframework.org/schema/data/jpa" xmlns:task="http://www.springframework.org/schema/task"
       xsi:schemaLocation="
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
		http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
		http://www.springframework.org/schema/data/jpa
		http://www.springframework.org/schema/data/jpa/spring-jpa.xsd">

    <!--spring 和 spring data jpa的配置-->
    <!--1.创建entityManagerFactory对象交给spring容器管理-->
    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <!--配置扫描的包(实体类所在的包)-->
        <property name="packagesToScan" value="cn.itcast.domain"/>
        <!--jpa的实现厂家-->
        <property name="persistenceProvider">
            <bean class="org.hibernate.jpa.HibernatePersistenceProvider"/>
        </property>
        <!--jpa的供应商适配器-->
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                <!--配置是否自动创建数据库表-->
                <property name="generateDdl" value="false"/>
                <!--指定数据库类型-->
                <property name="database" value="MYSQL"/>
                <!--数据库方言,支持的持有语法-->
                <property name="databasePlatform" value="org.hibernate.dialect.MySQLDialect"/>
                <!--是否显示sql-->
                <property name="showSql" value="true"/>
            </bean>
        </property>
        <!--jpa的方言,高级的特性-->
        <property name="jpaDialect">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect"/>
        </property>
    </bean>
    <!--2.创建数据库连接池-->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="user" value="root"></property>
        <property name="password" value=""></property>
        <property name="jdbcUrl" value="jdbc:mysql:///g_07?characterEncoding=utf-8"></property>
        <property name="driverClass" value="com.mysql.jdbc.Driver"></property>
    </bean>
    <!--3.整合spring data jpa-->
    <jpa:repositories base-package="cn.itcast.dao" transaction-manager-ref="transactionManager"
                      entity-manager-factory-ref="entityManagerFactory"></jpa:repositories>
    <!--4.配置事务管理器-->
    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory"></property>
    </bean>
    <!--5.声明式事务-->
    <!--6.配置包扫描-->
    <context:component-scan base-package="cn.itcast"></context:component-scan>
</beans>
package cn.itcast.domain;

import javax.persistence.*;

/**
 * 1.实体类和表的映射关系
 *      @Entity
 *      @Table
 * 2.类中属性和表中字段的映射关系
 *      @Id
 *      @GeneratedValue
 *      @Column
 */
@Entity
@Table(name = "cst_customer")
public class Customer {

    @Id//声明当前私有属性为主键
    @GeneratedValue(strategy= GenerationType.IDENTITY) //配置主键的生成策略
    @Column(name="cust_id") //指定和表中cust_id字段的映射关系
    private Long custId;

    @Column(name="cust_name") //指定和表中cust_name字段的映射关系
    private String custName;

    @Column(name="cust_source")//指定和表中cust_source字段的映射关系
    private String custSource;

    @Column(name="cust_industry")//指定和表中cust_industry字段的映射关系
    private String custIndustry;

    @Column(name="cust_level")//指定和表中cust_level字段的映射关系
    private String custLevel;

    @Column(name="cust_address")//指定和表中cust_address字段的映射关系
    private String custAddress;

    @Column(name="cust_phone")//指定和表中cust_phone字段的映射关系
    private String custPhone;

    @Override
    public String toString() {
        return "Customer{" +
                "custId=" + custId +
                ", custName='" + custName + '\'' +
                ", custSource='" + custSource + '\'' +
                ", custIndustry='" + custIndustry + '\'' +
                ", custLevel='" + custLevel + '\'' +
                ", custAddress='" + custAddress + '\'' +
                ", custPhone='" + custPhone + '\'' +
                '}';
    }

    public Long getCustId() {
        return custId;
    }

    public void setCustId(Long custId) {
        this.custId = custId;
    }

    public String getCustName() {
        return custName;
    }

    public void setCustName(String custName) {
        this.custName = custName;
    }

    public String getCustSource() {
        return custSource;
    }

    public void setCustSource(String custSource) {
        this.custSource = custSource;
    }

    public String getCustIndustry() {
        return custIndustry;
    }

    public void setCustIndustry(String custIndustry) {
        this.custIndustry = custIndustry;
    }

    public String getCustLevel() {
        return custLevel;
    }

    public void setCustLevel(String custLevel) {
        this.custLevel = custLevel;
    }

    public String getCustAddress() {
        return custAddress;
    }

    public void setCustAddress(String custAddress) {
        this.custAddress = custAddress;
    }

    public String getCustPhone() {
        return custPhone;
    }

    public void setCustPhone(String custPhone) {
        this.custPhone = custPhone;
    }
}

在这里插入图片描述
根据id查询
在这里插入图片描述
在这里插入图片描述
添加
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
修改
在这里插入图片描述
在这里插入图片描述
删除
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
查询所有
在这里插入图片描述
在这里插入图片描述

10.spring Data JPA执行过程及原理

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

11.spring Data JPA查询

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
使用jpql完成更新操作
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
查询全部
在这里插入图片描述
在这里插入图片描述
条件全部
在这里插入图片描述
在这里插入图片描述

12.方法命名规则查询

基本查询
在这里插入图片描述
在这里插入图片描述
模糊匹配
在这里插入图片描述
在这里插入图片描述
多条件查询
在这里插入图片描述
在这里插入图片描述

13.Specifications动态查询

在这里插入图片描述
在这里插入图片描述
配置的内容和JPA-2一样
在这里插入图片描述
在这里插入图片描述
查询单个对象

package cn.itcast.test;

import cn.itcast.dao.CustomerDao;
import cn.itcast.domain.Customer;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import javax.persistence.criteria.*;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:applicationContext.xml") //指定spring容器的配置信息
public class SpecTest {

    @Autowired(required = false)
    private CustomerDao customerDao;

    /**
     * 根据条件,查询单个对象
     */
    @Test
    public void testSpec(){
        /**
         * 匿名内部类
         *  自定义查询条件
         *          1.实现Specification接口(提供泛型,查询的对象类型)
         *          2.实现toPredicate方法(构造查询条件)
         *          3.需要借助方法参数中的两个参数(
         *              root:获取需要查询的对象属性
         *              CriteriaQuery:构造查询条件的,内部封装了很多的查询条件(模糊匹配,精准匹配)
         *          )
         * 案例:根据客户名称查询:查询客户名为张三的客户
         *      查询条件:
         *          1.查询方法:
         *              cb对象
         *          2.比较的属性名称
         *              root对象
         */
        Specification<Customer> spec = new Specification<Customer>() {
            @Override
            public Predicate toPredicate(Root<Customer> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
                //1.获取比较的属性
                Path<Object> custName = root.get("custName");
                //2.构造查询条件:  select * from cst_customer where cust_name = '李四'
                /**
                 * 第一个参数,需要比较的属性(path对象)
                 * 第二个参数,当前需要比较的取值
                 */
                //进行精准的匹配(比较的属性,比较的属性的取值)
                Predicate predicate = cb.equal(custName, "张三");
                return predicate;
            }
        };
        Customer customer = customerDao.findOne(spec);
        System.out.println(customer);
    }
}

在这里插入图片描述
完成多条件拼接

 /**
     * 多条件查询
     *      案例:根据客户名(张三)和客户所属行业查询(哈哈哈)
     */
    @Test
    public void testSpec1() {
        /**
         * root:获取属性
         *      客户名
         *      所属行业
         * cb:构造查询
         *      1.构造客户名的精准匹配查询
         *      2.构造所属行业的精准匹配查询
         *      3.将以上两个查询联系起来
         */
        Specification<Customer> spec = new Specification<Customer>() {
            @Override
            public Predicate toPredicate(Root<Customer> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
                //客户名
                Path<Object> custName = root.get("custName");
                //所属行业
                Path<Object> custIndustry = root.get("custIndustry");
                //构造查询
                //1.构造客户名的精准匹配查询
                //第一个参数,path(属性),第二个参数,属性的取值
                Predicate p1 = cb.equal(custName, "张三");
                //2.构造所属行业的精准匹配查询
                Predicate p2 = cb.equal(custIndustry, "哈哈哈");
                //3.将过个查询条件组合到一起,组合(满足条件一并且满足条件二:与关系。满足条件一或满足条件二即可:或关系)
                Predicate and = cb.and(p1, p2);
                //cb.or();以或的形式拼接多个查询条件
                return and;
            }
        };
        Customer customer = customerDao.findOne(spec);
        System.out.println(customer);
    }

在这里插入图片描述
模糊匹配查询
在这里插入图片描述
在这里插入图片描述
添加排序
在这里插入图片描述
分页查询
在这里插入图片描述
在这里插入图片描述

14.多表设计

在这里插入图片描述

15.JPA中的一对多

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>
<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">
    <parent>
        <artifactId>JPATest</artifactId>
        <groupId>cn.itcast</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>JPA-3-onetomany</artifactId>

    <properties>
        <spring.version>5.0.2.RELEASE</spring.version>
        <hibernate.version>5.0.7.Final</hibernate.version>
        <slf4j.version>1.6.6</slf4j.version>
        <log4j.version>1.2.12</log4j.version>
        <c3p0.version>0.9.1.2</c3p0.version>
        <mysql.version>5.1.6</mysql.version>
    </properties>

    <dependencies>
        <!-- junit单元测试 -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>

        <!-- spring beg -->
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.6.8</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <!--spring对orm框架的支持包-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <!-- spring end -->

        <!-- hibernate beg -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>${hibernate.version}</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>${hibernate.version}</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>5.2.1.Final</version>
        </dependency>
        <!-- hibernate end -->

        <!-- c3p0 beg -->
        <dependency>
            <groupId>c3p0</groupId>
            <artifactId>c3p0</artifactId>
            <version>${c3p0.version}</version>
        </dependency>
        <!-- c3p0 end -->

        <!-- log end -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>${log4j.version}</version>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${slf4j.version}</version>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>${slf4j.version}</version>
        </dependency>
        <!-- log end -->

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql.version}</version>
        </dependency>
        <!--spring data jpa的坐标-->
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-jpa</artifactId>
            <version>1.9.0.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <!-- el beg 使用spring data jpa 必须引入 -->
        <dependency>
            <groupId>javax.el</groupId>
            <artifactId>javax.el-api</artifactId>
            <version>2.2.4</version>
        </dependency>

        <dependency>
            <groupId>org.glassfish.web</groupId>
            <artifactId>javax.el</artifactId>
            <version>2.2.4</version>
        </dependency>
        <!-- el end -->
    </dependencies>
</project>

复制spec的main
在这里插入图片描述
创建LinkMan实体类

package cn.itcast.domain;
import javax.persistence.*;

@Entity
@Table(name = "cst_linkman")
public class LinkMan {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "lkm_id")
    private Long lkmId; //联系人编号(主键)
    @Column(name = "lkm_name")
    private String lkmName;//联系人姓名
    @Column(name = "lkm_gender")
    private String lkmGender;//联系人性别
    @Column(name = "lkm_phone")
    private String lkmPhone;//联系人办公电话
    @Column(name = "lkm_mobile")
    private String lkmMobile;//联系人手机
    @Column(name = "lkm_email")
    private String lkmEmail;//联系人邮箱
    @Column(name = "lkm_position")
    private String lkmPosition;//联系人职位
    @Column(name = "lkm_memo")
    private String lkmMemo;//联系人备注

    /**
     * 配置联系人到客户的多对一关系
     *     使用注解的形式配置多对一关系
     *      1.配置表关系
     *          @ManyToOne : 配置多对一关系
     *              targetEntity:对方的实体类字节码
     *      2.配置外键(中间表)
     * 配置外键的过程,配置到了多的一方,就会在多的一方维护外键
     */
    @ManyToOne(targetEntity = Customer.class)
    @JoinColumn(name = "lkm_cust_id",referencedColumnName = "cust_id")
    private Customer customer;

    public Long getLkmId() {
        return lkmId;
    }

    public void setLkmId(Long lkmId) {
        this.lkmId = lkmId;
    }

    public String getLkmName() {
        return lkmName;
    }

    public void setLkmName(String lkmName) {
        this.lkmName = lkmName;
    }

    public String getLkmGender() {
        return lkmGender;
    }

    public void setLkmGender(String lkmGender) {
        this.lkmGender = lkmGender;
    }

    public String getLkmPhone() {
        return lkmPhone;
    }

    public void setLkmPhone(String lkmPhone) {
        this.lkmPhone = lkmPhone;
    }

    public String getLkmMobile() {
        return lkmMobile;
    }

    public void setLkmMobile(String lkmMobile) {
        this.lkmMobile = lkmMobile;
    }

    public String getLkmEmail() {
        return lkmEmail;
    }

    public void setLkmEmail(String lkmEmail) {
        this.lkmEmail = lkmEmail;
    }

    public String getLkmPosition() {
        return lkmPosition;
    }

    public void setLkmPosition(String lkmPosition) {
        this.lkmPosition = lkmPosition;
    }

    public String getLkmMemo() {
        return lkmMemo;
    }

    public void setLkmMemo(String lkmMemo) {
        this.lkmMemo = lkmMemo;
    }

    public Customer getCustomer() {
        return customer;
    }

    public void setCustomer(Customer customer) {
        this.customer = customer;
    }

    @Override
    public String toString() {
        return "LinkMan{" +
                "lkmId=" + lkmId +
                ", lkmName='" + lkmName + '\'' +
                ", lkmGender='" + lkmGender + '\'' +
                ", lkmPhone='" + lkmPhone + '\'' +
                ", lkmMobile='" + lkmMobile + '\'' +
                ", lkmEmail='" + lkmEmail + '\'' +
                ", lkmPosition='" + lkmPosition + '\'' +
                ", lkmMemo='" + lkmMemo + '\'' +
                '}';
    }
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
测试

package cn.itcast.test;

import cn.itcast.dao.CustomerDao;
import cn.itcast.dao.LinkManDao;
import cn.itcast.domain.Customer;
import cn.itcast.domain.LinkMan;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.annotation.Rollback;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.annotation.Transactional;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:applicationContext.xml")
public class OneToManyTest {

    @Autowired
    private CustomerDao customerDao;

    @Autowired
    private LinkManDao linkManDao;

    /**
     * 保存一个客户,保存一个联系人
     *  效果:客户和联系人作为独立的数据保存到数据库中
     *      联系人的外键为空
     *  原因?
     *      实体类中没有配置关系
     */
    @Test
    @Transactional //配置事务
    @Rollback(false) //不自动回滚
    public void testAdd() {
        //创建一个客户,创建一个联系人
        Customer customer = new Customer();
        customer.setCustName("百度");

        LinkMan linkMan = new LinkMan();
        linkMan.setLkmName("小李");
        /**
         * 配置了客户到联系人的关系
         *      从客户的角度上:发送两条insert语句,发送一条更新语句更新数据库(更新外键)
         * 由于我们配置了客户到联系人的关系:客户可以对外键进行维护
         */
        customer.getLinkMans().add(linkMan);

        customerDao.save(customer);
        linkManDao.save(linkMan);
    }
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
放弃外键维护
在这里插入图片描述
在这里插入图片描述
删除的说明和级联的引入
在这里插入图片描述
级联操作
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

16.JPA中的多对多

在这里插入图片描述
在这里插入图片描述
复制之前的
在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:jpa="http://www.springframework.org/schema/data/jpa" xmlns:task="http://www.springframework.org/schema/task"
       xsi:schemaLocation="
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
		http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
		http://www.springframework.org/schema/data/jpa
		http://www.springframework.org/schema/data/jpa/spring-jpa.xsd">

    <!--spring 和 spring data jpa的配置-->
    <!--1.创建entityManagerFactory对象交给spring容器管理-->
    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <!--配置扫描的包(实体类所在的包)-->
        <property name="packagesToScan" value="cn.itcast.domain"/>
        <!--jpa的实现厂家-->
        <property name="persistenceProvider">
            <bean class="org.hibernate.jpa.HibernatePersistenceProvider"/>
        </property>
        <!--jpa的供应商适配器-->
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                <!--配置是否自动创建数据库表-->
                <property name="generateDdl" value="false"/>
                <!--指定数据库类型-->
                <property name="database" value="MYSQL"/>
                <!--数据库方言,支持的持有语法-->
                <property name="databasePlatform" value="org.hibernate.dialect.MySQLDialect"/>
                <!--是否显示sql-->
                <property name="showSql" value="true"/>
            </bean>
        </property>
        <!--jpa的方言,高级的特性-->
        <property name="jpaDialect">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect"/>
        </property>
        <!--注入jpa的配置信息
            加载jpa的基本配置信息和jpa实现方式(hibernate)的配置信息
            hibernate.hbm2ddl.auto : 自动创建数据库表
                create : 每次都会重新创建数据库表
                update:有表不会重新创建,没有表会重新创建表
        -->
        <property name="jpaProperties" >
            <props>
                <prop key="hibernate.hbm2ddl.auto">create</prop>
            </props>
        </property>
    </bean>
    <!--2.创建数据库连接池-->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="user" value="root"></property>
        <property name="password" value="960914"></property>
        <property name="jdbcUrl" value="jdbc:mysql:///g_07?characterEncoding=utf-8"></property>
        <property name="driverClass" value="com.mysql.jdbc.Driver"></property>
    </bean>
    <!--3.整合spring data jpa-->
    <jpa:repositories base-package="cn.itcast.dao" transaction-manager-ref="transactionManager"
                      entity-manager-factory-ref="entityManagerFactory"></jpa:repositories>
    <!--4.配置事务管理器-->
    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory"></property>
    </bean>
    <!-- 4.txAdvice-->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="save*" propagation="REQUIRED"/>
            <tx:method name="insert*" propagation="REQUIRED"/>
            <tx:method name="update*" propagation="REQUIRED"/>
            <tx:method name="delete*" propagation="REQUIRED"/>
            <tx:method name="get*" read-only="true"/>
            <tx:method name="find*" read-only="true"/>
            <tx:method name="*" propagation="REQUIRED"/>
        </tx:attributes>
    </tx:advice>
    <!-- 5.aop-->
    <aop:config>
        <aop:pointcut id="pointcut" expression="execution(* cn.itcast.service.*.*(..))" />
        <aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut" />
    </aop:config>
    <!--5.声明式事务-->
    <!--6.配置包扫描-->
    <context:component-scan base-package="cn.itcast"></context:component-scan>
</beans>

放弃维护权

package cn.itcast.domain;

import javax.persistence.*;
import java.util.HashSet;
import java.util.Set;

@Entity
@Table(name = "sys_user")
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="user_id")
    private Long userId;
    @Column(name="user_name")
    private String userName;
    @Column(name="age")
    private Integer age;

    /**
     * 配置用户到角色的多对多关系
     *      配置多对多的映射关系
     *          1.声明表关系的配置
     *              @ManyToMany(targetEntity = Role.class)  //多对多
     *                  targetEntity:代表对方的实体类字节码
     *          2.配置中间表(包含两个外键)
     *                @JoinTable
     *                  name : 中间表的名称
     *                  joinColumns:配置当前对象在中间表的外键
     *                      @JoinColumn的数组
     *                          name:外键名
     *                          referencedColumnName:参照的主表的主键名
     *                  inverseJoinColumns:配置对方对象在中间表的外键
     */
    @ManyToMany(targetEntity = Role.class,cascade = CascadeType.ALL)
    @JoinTable(name = "sys_user_role",
            //joinColumns,当前对象在中间表中的外键
            joinColumns = {@JoinColumn(name = "sys_user_id",referencedColumnName = "user_id")},
            //inverseJoinColumns,对方对象在中间表的外键
            inverseJoinColumns = {@JoinColumn(name = "sys_role_id",referencedColumnName = "role_id")}
    )
    private Set<Role> roles = new HashSet<>();

    public Long getUserId() {
        return userId;
    }

    public void setUserId(Long userId) {
        this.userId = userId;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Set<Role> getRoles() {
        return roles;
    }

    public void setRoles(Set<Role> roles) {
        this.roles = roles;
    }
}

在这里插入图片描述

package cn.itcast.domain;

import javax.persistence.*;
import java.util.HashSet;
import java.util.Set;

@Entity
@Table(name = "sys_role")
public class Role {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "role_id")
    private Long roleId;
    @Column(name = "role_name")
    private String roleName;

    //配置多对多
    @ManyToMany(mappedBy = "roles")  //配置多表关系
    private Set<User> users = new HashSet<>();

    public Long getRoleId() {
        return roleId;
    }

    public void setRoleId(Long roleId) {
        this.roleId = roleId;
    }

    public String getRoleName() {
        return roleName;
    }

    public void setRoleName(String roleName) {
        this.roleName = roleName;
    }

    public Set<User> getUsers() {
        return users;
    }

    public void setUsers(Set<User> users) {
        this.users = users;
    }
}

在这里插入图片描述

package cn.itcast.test;

import cn.itcast.dao.RoleDao;
import cn.itcast.dao.UserDao;
import cn.itcast.domain.Role;
import cn.itcast.domain.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.annotation.Rollback;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.annotation.Transactional;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:applicationContext.xml")
public class ManyToManyTest {

    @Autowired
    private UserDao userDao;
    @Autowired
    private RoleDao roleDao;

    /**
     * 保存一个用户,保存一个角色
     *  多对多放弃维护权:被动的一方放弃
     */
    @Test
    @Transactional
    @Rollback(false)
    public void  testAdd() {
        User user = new User();
        user.setUserName("小李");

        Role role = new Role();
        role.setRoleName("java程序员");

        //配置用户到角色关系,可以对中间表中的数据进行维护     1-1
        user.getRoles().add(role);

        //配置角色到用户的关系,可以对中间表的数据进行维护     1-1
        role.getUsers().add(user);

        userDao.save(user);
        roleDao.save(role);
    }
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
级联添加
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
级联删除
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

17.Spring Data JPA中的多表查询

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

D:\JAVA\jdk1.8.0_131\bin\java.exe -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:D:\JAVA\idea\IntelliJ IDEA 2019.3.3\lib\idea_rt.jar=1644:D:\JAVA\idea\IntelliJ IDEA 2019.3.3\bin" -Dfile.encoding=UTF-8 -classpath "D:\JAVA\idea\IntelliJ IDEA 2019.3.3\lib\idea_rt.jar;D:\JAVA\idea\IntelliJ IDEA 2019.3.3\plugins\junit\lib\junit5-rt.jar;D:\JAVA\idea\IntelliJ IDEA 2019.3.3\plugins\junit\lib\junit-rt.jar;D:\JAVA\jdk1.8.0_131\jre\lib\charsets.jar;D:\JAVA\jdk1.8.0_131\jre\lib\deploy.jar;D:\JAVA\jdk1.8.0_131\jre\lib\ext\access-bridge-64.jar;D:\JAVA\jdk1.8.0_131\jre\lib\ext\cldrdata.jar;D:\JAVA\jdk1.8.0_131\jre\lib\ext\dnsns.jar;D:\JAVA\jdk1.8.0_131\jre\lib\ext\jaccess.jar;D:\JAVA\jdk1.8.0_131\jre\lib\ext\jfxrt.jar;D:\JAVA\jdk1.8.0_131\jre\lib\ext\localedata.jar;D:\JAVA\jdk1.8.0_131\jre\lib\ext\nashorn.jar;D:\JAVA\jdk1.8.0_131\jre\lib\ext\sunec.jar;D:\JAVA\jdk1.8.0_131\jre\lib\ext\sunjce_provider.jar;D:\JAVA\jdk1.8.0_131\jre\lib\ext\sunmscapi.jar;D:\JAVA\jdk1.8.0_131\jre\lib\ext\sunpkcs11.jar;D:\JAVA\jdk1.8.0_131\jre\lib\ext\zipfs.jar;D:\JAVA\jdk1.8.0_131\jre\lib\javaws.jar;D:\JAVA\jdk1.8.0_131\jre\lib\jce.jar;D:\JAVA\jdk1.8.0_131\jre\lib\jfr.jar;D:\JAVA\jdk1.8.0_131\jre\lib\jfxswt.jar;D:\JAVA\jdk1.8.0_131\jre\lib\jsse.jar;D:\JAVA\jdk1.8.0_131\jre\lib\management-agent.jar;D:\JAVA\jdk1.8.0_131\jre\lib\plugin.jar;D:\JAVA\jdk1.8.0_131\jre\lib\resources.jar;D:\JAVA\jdk1.8.0_131\jre\lib\rt.jar;D:\ideaPage\JPATest\JPA-3-onetomany\target\test-classes;D:\ideaPage\JPATest\JPA-3-onetomany\target\classes;D:\apache-maven-3.6.1\respository\junit\junit\4.12\junit-4.12.jar;D:\apache-maven-3.6.1\respository\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar;D:\apache-maven-3.6.1\respository\org\aspectj\aspectjweaver\1.6.8\aspectjweaver-1.6.8.jar;D:\apache-maven-3.6.1\respository\org\springframework\spring-aop\5.0.2.RELEASE\spring-aop-5.0.2.RELEASE.jar;D:\apache-maven-3.6.1\respository\org\springframework\spring-context\5.0.2.RELEASE\spring-context-5.0.2.RELEASE.jar;D:\apache-maven-3.6.1\respository\org\springframework\spring-expression\5.0.2.RELEASE\spring-expression-5.0.2.RELEASE.jar;D:\apache-maven-3.6.1\respository\org\springframework\spring-context-support\5.0.2.RELEASE\spring-context-support-5.0.2.RELEASE.jar;D:\apache-maven-3.6.1\respository\org\springframework\spring-orm\5.0.2.RELEASE\spring-orm-5.0.2.RELEASE.jar;D:\apache-maven-3.6.1\respository\org\springframework\spring-jdbc\5.0.2.RELEASE\spring-jdbc-5.0.2.RELEASE.jar;D:\apache-maven-3.6.1\respository\org\springframework\spring-tx\5.0.2.RELEASE\spring-tx-5.0.2.RELEASE.jar;D:\apache-maven-3.6.1\respository\org\springframework\spring-beans\5.0.2.RELEASE\spring-beans-5.0.2.RELEASE.jar;D:\apache-maven-3.6.1\respository\org\springframework\spring-core\5.0.2.RELEASE\spring-core-5.0.2.RELEASE.jar;D:\apache-maven-3.6.1\respository\org\springframework\spring-jcl\5.0.2.RELEASE\spring-jcl-5.0.2.RELEASE.jar;D:\apache-maven-3.6.1\respository\org\hibernate\hibernate-core\5.0.7.Final\hibernate-core-5.0.7.Final.jar;D:\apache-maven-3.6.1\respository\org\jboss\logging\jboss-logging\3.3.0.Final\jboss-logging-3.3.0.Final.jar;D:\apache-maven-3.6.1\respository\org\hibernate\javax\persistence\hibernate-jpa-2.1-api\1.0.0.Final\hibernate-jpa-2.1-api-1.0.0.Final.jar;D:\apache-maven-3.6.1\respository\org\javassist\javassist\3.18.1-GA\javassist-3.18.1-GA.jar;D:\apache-maven-3.6.1\respository\antlr\antlr\2.7.7\antlr-2.7.7.jar;D:\apache-maven-3.6.1\respository\org\apache\geronimo\specs\geronimo-jta_1.1_spec\1.1.1\geronimo-jta_1.1_spec-1.1.1.jar;D:\apache-maven-3.6.1\respository\org\jboss\jandex\2.0.0.Final\jandex-2.0.0.Final.jar;D:\apache-maven-3.6.1\respository\dom4j\dom4j\1.6.1\dom4j-1.6.1.jar;D:\apache-maven-3.6.1\respository\xml-apis\xml-apis\1.0.b2\xml-apis-1.0.b2.jar;D:\apache-maven-3.6.1\respository\org\hibernate\common\hibernate-commons-annotations\5.0.1.Final\hibernate-commons-annotations-5.0.1.Final.jar;D:\apache-maven-3.6.1\respository\org\hibernate\hibernate-entitymanager\5.0.7.Final\hibernate-entitymanager-5.0.7.Final.jar;D:\apache-maven-3.6.1\respository\org\hibernate\hibernate-validator\5.2.1.Final\hibernate-validator-5.2.1.Final.jar;D:\apache-maven-3.6.1\respository\javax\validation\validation-api\1.1.0.Final\validation-api-1.1.0.Final.jar;D:\apache-maven-3.6.1\respository\com\fasterxml\classmate\1.1.0\classmate-1.1.0.jar;D:\apache-maven-3.6.1\respository\c3p0\c3p0\0.9.1.2\c3p0-0.9.1.2.jar;D:\apache-maven-3.6.1\respository\log4j\log4j\1.2.12\log4j-1.2.12.jar;D:\apache-maven-3.6.1\respository\org\slf4j\slf4j-api\1.6.6\slf4j-api-1.6.6.jar;D:\apache-maven-3.6.1\respository\org\slf4j\slf4j-log4j12\1.6.6\slf4j-log4j12-1.6.6.jar;D:\apache-maven-3.6.1\respository\mysql\mysql-connector-java\5.1.6\mysql-connector-java-5.1.6.jar;D:\apache-maven-3.6.1\respository\org\springframework\data\spring-data-jpa\1.9.0.RELEASE\spring-data-jpa-1.9.0.RELEASE.jar;D:\apache-maven-3.6.1\respository\org\springframework\data\spring-data-commons\1.11.0.RELEASE\spring-data-commons-1.11.0.RELEASE.jar;D:\apache-maven-3.6.1\respository\org\aspectj\aspectjrt\1.8.6\aspectjrt-1.8.6.jar;D:\apache-maven-3.6.1\respository\org\slf4j\jcl-over-slf4j\1.7.12\jcl-over-slf4j-1.7.12.jar;D:\apache-maven-3.6.1\respository\org\springframework\spring-test\5.0.2.RELEASE\spring-test-5.0.2.RELEASE.jar;D:\apache-maven-3.6.1\respository\javax\el\javax.el-api\2.2.4\javax.el-api-2.2.4.jar;D:\apache-maven-3.6.1\respository\org\glassfish\web\javax.el\2.2.4\javax.el-2.2.4.jar" com.intellij.rt.junit.JUnitStarter -ideVersion5 -junit4 cn.itcast.test.ObjectQueryTest,testQuery2
log4j:WARN No appenders could be found for logger (org.springframework.test.context.junit4.SpringJUnit4ClassRunner).
log4j:WARN Please initialize the log4j system properly.
Hibernate: select customer0_.cust_id as cust_id1_0_0_, customer0_.cust_address as cust_add2_0_0_, customer0_.cust_industry as cust_ind3_0_0_, customer0_.cust_level as cust_lev4_0_0_, customer0_.cust_name as cust_nam5_0_0_, customer0_.cust_phone as cust_pho6_0_0_, customer0_.cust_source as cust_sou7_0_0_ from cst_customer customer0_ where customer0_.cust_id=?
Hibernate: select linkmans0_.lkm_cust_id as lkm_cust9_1_0_, linkmans0_.lkm_id as lkm_id1_1_0_, linkmans0_.lkm_id as lkm_id1_1_1_, linkmans0_.lkm_cust_id as lkm_cust9_1_1_, linkmans0_.lkm_email as lkm_emai2_1_1_, linkmans0_.lkm_gender as lkm_gend3_1_1_, linkmans0_.lkm_memo as lkm_memo4_1_1_, linkmans0_.lkm_mobile as lkm_mobi5_1_1_, linkmans0_.lkm_name as lkm_name6_1_1_, linkmans0_.lkm_phone as lkm_phon7_1_1_, linkmans0_.lkm_position as lkm_posi8_1_1_ from cst_linkman linkmans0_ where linkmans0_.lkm_cust_id=?
2

Process finished with exit code 0

在这里插入图片描述
在这里插入图片描述

D:\JAVA\jdk1.8.0_131\bin\java.exe -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:D:\JAVA\idea\IntelliJ IDEA 2019.3.3\lib\idea_rt.jar=2475:D:\JAVA\idea\IntelliJ IDEA 2019.3.3\bin" -Dfile.encoding=UTF-8 -classpath "D:\JAVA\idea\IntelliJ IDEA 2019.3.3\lib\idea_rt.jar;D:\JAVA\idea\IntelliJ IDEA 2019.3.3\plugins\junit\lib\junit5-rt.jar;D:\JAVA\idea\IntelliJ IDEA 2019.3.3\plugins\junit\lib\junit-rt.jar;D:\JAVA\jdk1.8.0_131\jre\lib\charsets.jar;D:\JAVA\jdk1.8.0_131\jre\lib\deploy.jar;D:\JAVA\jdk1.8.0_131\jre\lib\ext\access-bridge-64.jar;D:\JAVA\jdk1.8.0_131\jre\lib\ext\cldrdata.jar;D:\JAVA\jdk1.8.0_131\jre\lib\ext\dnsns.jar;D:\JAVA\jdk1.8.0_131\jre\lib\ext\jaccess.jar;D:\JAVA\jdk1.8.0_131\jre\lib\ext\jfxrt.jar;D:\JAVA\jdk1.8.0_131\jre\lib\ext\localedata.jar;D:\JAVA\jdk1.8.0_131\jre\lib\ext\nashorn.jar;D:\JAVA\jdk1.8.0_131\jre\lib\ext\sunec.jar;D:\JAVA\jdk1.8.0_131\jre\lib\ext\sunjce_provider.jar;D:\JAVA\jdk1.8.0_131\jre\lib\ext\sunmscapi.jar;D:\JAVA\jdk1.8.0_131\jre\lib\ext\sunpkcs11.jar;D:\JAVA\jdk1.8.0_131\jre\lib\ext\zipfs.jar;D:\JAVA\jdk1.8.0_131\jre\lib\javaws.jar;D:\JAVA\jdk1.8.0_131\jre\lib\jce.jar;D:\JAVA\jdk1.8.0_131\jre\lib\jfr.jar;D:\JAVA\jdk1.8.0_131\jre\lib\jfxswt.jar;D:\JAVA\jdk1.8.0_131\jre\lib\jsse.jar;D:\JAVA\jdk1.8.0_131\jre\lib\management-agent.jar;D:\JAVA\jdk1.8.0_131\jre\lib\plugin.jar;D:\JAVA\jdk1.8.0_131\jre\lib\resources.jar;D:\JAVA\jdk1.8.0_131\jre\lib\rt.jar;D:\ideaPage\JPATest\JPA-3-onetomany\target\test-classes;D:\ideaPage\JPATest\JPA-3-onetomany\target\classes;D:\apache-maven-3.6.1\respository\junit\junit\4.12\junit-4.12.jar;D:\apache-maven-3.6.1\respository\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar;D:\apache-maven-3.6.1\respository\org\aspectj\aspectjweaver\1.6.8\aspectjweaver-1.6.8.jar;D:\apache-maven-3.6.1\respository\org\springframework\spring-aop\5.0.2.RELEASE\spring-aop-5.0.2.RELEASE.jar;D:\apache-maven-3.6.1\respository\org\springframework\spring-context\5.0.2.RELEASE\spring-context-5.0.2.RELEASE.jar;D:\apache-maven-3.6.1\respository\org\springframework\spring-expression\5.0.2.RELEASE\spring-expression-5.0.2.RELEASE.jar;D:\apache-maven-3.6.1\respository\org\springframework\spring-context-support\5.0.2.RELEASE\spring-context-support-5.0.2.RELEASE.jar;D:\apache-maven-3.6.1\respository\org\springframework\spring-orm\5.0.2.RELEASE\spring-orm-5.0.2.RELEASE.jar;D:\apache-maven-3.6.1\respository\org\springframework\spring-jdbc\5.0.2.RELEASE\spring-jdbc-5.0.2.RELEASE.jar;D:\apache-maven-3.6.1\respository\org\springframework\spring-tx\5.0.2.RELEASE\spring-tx-5.0.2.RELEASE.jar;D:\apache-maven-3.6.1\respository\org\springframework\spring-beans\5.0.2.RELEASE\spring-beans-5.0.2.RELEASE.jar;D:\apache-maven-3.6.1\respository\org\springframework\spring-core\5.0.2.RELEASE\spring-core-5.0.2.RELEASE.jar;D:\apache-maven-3.6.1\respository\org\springframework\spring-jcl\5.0.2.RELEASE\spring-jcl-5.0.2.RELEASE.jar;D:\apache-maven-3.6.1\respository\org\hibernate\hibernate-core\5.0.7.Final\hibernate-core-5.0.7.Final.jar;D:\apache-maven-3.6.1\respository\org\jboss\logging\jboss-logging\3.3.0.Final\jboss-logging-3.3.0.Final.jar;D:\apache-maven-3.6.1\respository\org\hibernate\javax\persistence\hibernate-jpa-2.1-api\1.0.0.Final\hibernate-jpa-2.1-api-1.0.0.Final.jar;D:\apache-maven-3.6.1\respository\org\javassist\javassist\3.18.1-GA\javassist-3.18.1-GA.jar;D:\apache-maven-3.6.1\respository\antlr\antlr\2.7.7\antlr-2.7.7.jar;D:\apache-maven-3.6.1\respository\org\apache\geronimo\specs\geronimo-jta_1.1_spec\1.1.1\geronimo-jta_1.1_spec-1.1.1.jar;D:\apache-maven-3.6.1\respository\org\jboss\jandex\2.0.0.Final\jandex-2.0.0.Final.jar;D:\apache-maven-3.6.1\respository\dom4j\dom4j\1.6.1\dom4j-1.6.1.jar;D:\apache-maven-3.6.1\respository\xml-apis\xml-apis\1.0.b2\xml-apis-1.0.b2.jar;D:\apache-maven-3.6.1\respository\org\hibernate\common\hibernate-commons-annotations\5.0.1.Final\hibernate-commons-annotations-5.0.1.Final.jar;D:\apache-maven-3.6.1\respository\org\hibernate\hibernate-entitymanager\5.0.7.Final\hibernate-entitymanager-5.0.7.Final.jar;D:\apache-maven-3.6.1\respository\org\hibernate\hibernate-validator\5.2.1.Final\hibernate-validator-5.2.1.Final.jar;D:\apache-maven-3.6.1\respository\javax\validation\validation-api\1.1.0.Final\validation-api-1.1.0.Final.jar;D:\apache-maven-3.6.1\respository\com\fasterxml\classmate\1.1.0\classmate-1.1.0.jar;D:\apache-maven-3.6.1\respository\c3p0\c3p0\0.9.1.2\c3p0-0.9.1.2.jar;D:\apache-maven-3.6.1\respository\log4j\log4j\1.2.12\log4j-1.2.12.jar;D:\apache-maven-3.6.1\respository\org\slf4j\slf4j-api\1.6.6\slf4j-api-1.6.6.jar;D:\apache-maven-3.6.1\respository\org\slf4j\slf4j-log4j12\1.6.6\slf4j-log4j12-1.6.6.jar;D:\apache-maven-3.6.1\respository\mysql\mysql-connector-java\5.1.6\mysql-connector-java-5.1.6.jar;D:\apache-maven-3.6.1\respository\org\springframework\data\spring-data-jpa\1.9.0.RELEASE\spring-data-jpa-1.9.0.RELEASE.jar;D:\apache-maven-3.6.1\respository\org\springframework\data\spring-data-commons\1.11.0.RELEASE\spring-data-commons-1.11.0.RELEASE.jar;D:\apache-maven-3.6.1\respository\org\aspectj\aspectjrt\1.8.6\aspectjrt-1.8.6.jar;D:\apache-maven-3.6.1\respository\org\slf4j\jcl-over-slf4j\1.7.12\jcl-over-slf4j-1.7.12.jar;D:\apache-maven-3.6.1\respository\org\springframework\spring-test\5.0.2.RELEASE\spring-test-5.0.2.RELEASE.jar;D:\apache-maven-3.6.1\respository\javax\el\javax.el-api\2.2.4\javax.el-api-2.2.4.jar;D:\apache-maven-3.6.1\respository\org\glassfish\web\javax.el\2.2.4\javax.el-2.2.4.jar" com.intellij.rt.junit.JUnitStarter -ideVersion5 -junit4 cn.itcast.test.ObjectQueryTest,testQuery2
log4j:WARN No appenders could be found for logger (org.springframework.test.context.junit4.SpringJUnit4ClassRunner).
log4j:WARN Please initialize the log4j system properly.
Hibernate: select customer0_.cust_id as cust_id1_0_0_, customer0_.cust_address as cust_add2_0_0_, customer0_.cust_industry as cust_ind3_0_0_, customer0_.cust_level as cust_lev4_0_0_, customer0_.cust_name as cust_nam5_0_0_, customer0_.cust_phone as cust_pho6_0_0_, customer0_.cust_source as cust_sou7_0_0_, linkmans1_.lkm_cust_id as lkm_cust9_1_1_, linkmans1_.lkm_id as lkm_id1_1_1_, linkmans1_.lkm_id as lkm_id1_1_2_, linkmans1_.lkm_cust_id as lkm_cust9_1_2_, linkmans1_.lkm_email as lkm_emai2_1_2_, linkmans1_.lkm_gender as lkm_gend3_1_2_, linkmans1_.lkm_memo as lkm_memo4_1_2_, linkmans1_.lkm_mobile as lkm_mobi5_1_2_, linkmans1_.lkm_name as lkm_name6_1_2_, linkmans1_.lkm_phone as lkm_phon7_1_2_, linkmans1_.lkm_position as lkm_posi8_1_2_ from cst_customer customer0_ left outer join cst_linkman linkmans1_ on customer0_.cust_id=linkmans1_.lkm_cust_id where customer0_.cust_id=?
2

Process finished with exit code 0

在这里插入图片描述
在这里插入图片描述

D:\JAVA\jdk1.8.0_131\bin\java.exe -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:D:\JAVA\idea\IntelliJ IDEA 2019.3.3\lib\idea_rt.jar=1960:D:\JAVA\idea\IntelliJ IDEA 2019.3.3\bin" -Dfile.encoding=UTF-8 -classpath "D:\JAVA\idea\IntelliJ IDEA 2019.3.3\lib\idea_rt.jar;D:\JAVA\idea\IntelliJ IDEA 2019.3.3\plugins\junit\lib\junit5-rt.jar;D:\JAVA\idea\IntelliJ IDEA 2019.3.3\plugins\junit\lib\junit-rt.jar;D:\JAVA\jdk1.8.0_131\jre\lib\charsets.jar;D:\JAVA\jdk1.8.0_131\jre\lib\deploy.jar;D:\JAVA\jdk1.8.0_131\jre\lib\ext\access-bridge-64.jar;D:\JAVA\jdk1.8.0_131\jre\lib\ext\cldrdata.jar;D:\JAVA\jdk1.8.0_131\jre\lib\ext\dnsns.jar;D:\JAVA\jdk1.8.0_131\jre\lib\ext\jaccess.jar;D:\JAVA\jdk1.8.0_131\jre\lib\ext\jfxrt.jar;D:\JAVA\jdk1.8.0_131\jre\lib\ext\localedata.jar;D:\JAVA\jdk1.8.0_131\jre\lib\ext\nashorn.jar;D:\JAVA\jdk1.8.0_131\jre\lib\ext\sunec.jar;D:\JAVA\jdk1.8.0_131\jre\lib\ext\sunjce_provider.jar;D:\JAVA\jdk1.8.0_131\jre\lib\ext\sunmscapi.jar;D:\JAVA\jdk1.8.0_131\jre\lib\ext\sunpkcs11.jar;D:\JAVA\jdk1.8.0_131\jre\lib\ext\zipfs.jar;D:\JAVA\jdk1.8.0_131\jre\lib\javaws.jar;D:\JAVA\jdk1.8.0_131\jre\lib\jce.jar;D:\JAVA\jdk1.8.0_131\jre\lib\jfr.jar;D:\JAVA\jdk1.8.0_131\jre\lib\jfxswt.jar;D:\JAVA\jdk1.8.0_131\jre\lib\jsse.jar;D:\JAVA\jdk1.8.0_131\jre\lib\management-agent.jar;D:\JAVA\jdk1.8.0_131\jre\lib\plugin.jar;D:\JAVA\jdk1.8.0_131\jre\lib\resources.jar;D:\JAVA\jdk1.8.0_131\jre\lib\rt.jar;D:\ideaPage\JPATest\JPA-3-onetomany\target\test-classes;D:\ideaPage\JPATest\JPA-3-onetomany\target\classes;D:\apache-maven-3.6.1\respository\junit\junit\4.12\junit-4.12.jar;D:\apache-maven-3.6.1\respository\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar;D:\apache-maven-3.6.1\respository\org\aspectj\aspectjweaver\1.6.8\aspectjweaver-1.6.8.jar;D:\apache-maven-3.6.1\respository\org\springframework\spring-aop\5.0.2.RELEASE\spring-aop-5.0.2.RELEASE.jar;D:\apache-maven-3.6.1\respository\org\springframework\spring-context\5.0.2.RELEASE\spring-context-5.0.2.RELEASE.jar;D:\apache-maven-3.6.1\respository\org\springframework\spring-expression\5.0.2.RELEASE\spring-expression-5.0.2.RELEASE.jar;D:\apache-maven-3.6.1\respository\org\springframework\spring-context-support\5.0.2.RELEASE\spring-context-support-5.0.2.RELEASE.jar;D:\apache-maven-3.6.1\respository\org\springframework\spring-orm\5.0.2.RELEASE\spring-orm-5.0.2.RELEASE.jar;D:\apache-maven-3.6.1\respository\org\springframework\spring-jdbc\5.0.2.RELEASE\spring-jdbc-5.0.2.RELEASE.jar;D:\apache-maven-3.6.1\respository\org\springframework\spring-tx\5.0.2.RELEASE\spring-tx-5.0.2.RELEASE.jar;D:\apache-maven-3.6.1\respository\org\springframework\spring-beans\5.0.2.RELEASE\spring-beans-5.0.2.RELEASE.jar;D:\apache-maven-3.6.1\respository\org\springframework\spring-core\5.0.2.RELEASE\spring-core-5.0.2.RELEASE.jar;D:\apache-maven-3.6.1\respository\org\springframework\spring-jcl\5.0.2.RELEASE\spring-jcl-5.0.2.RELEASE.jar;D:\apache-maven-3.6.1\respository\org\hibernate\hibernate-core\5.0.7.Final\hibernate-core-5.0.7.Final.jar;D:\apache-maven-3.6.1\respository\org\jboss\logging\jboss-logging\3.3.0.Final\jboss-logging-3.3.0.Final.jar;D:\apache-maven-3.6.1\respository\org\hibernate\javax\persistence\hibernate-jpa-2.1-api\1.0.0.Final\hibernate-jpa-2.1-api-1.0.0.Final.jar;D:\apache-maven-3.6.1\respository\org\javassist\javassist\3.18.1-GA\javassist-3.18.1-GA.jar;D:\apache-maven-3.6.1\respository\antlr\antlr\2.7.7\antlr-2.7.7.jar;D:\apache-maven-3.6.1\respository\org\apache\geronimo\specs\geronimo-jta_1.1_spec\1.1.1\geronimo-jta_1.1_spec-1.1.1.jar;D:\apache-maven-3.6.1\respository\org\jboss\jandex\2.0.0.Final\jandex-2.0.0.Final.jar;D:\apache-maven-3.6.1\respository\dom4j\dom4j\1.6.1\dom4j-1.6.1.jar;D:\apache-maven-3.6.1\respository\xml-apis\xml-apis\1.0.b2\xml-apis-1.0.b2.jar;D:\apache-maven-3.6.1\respository\org\hibernate\common\hibernate-commons-annotations\5.0.1.Final\hibernate-commons-annotations-5.0.1.Final.jar;D:\apache-maven-3.6.1\respository\org\hibernate\hibernate-entitymanager\5.0.7.Final\hibernate-entitymanager-5.0.7.Final.jar;D:\apache-maven-3.6.1\respository\org\hibernate\hibernate-validator\5.2.1.Final\hibernate-validator-5.2.1.Final.jar;D:\apache-maven-3.6.1\respository\javax\validation\validation-api\1.1.0.Final\validation-api-1.1.0.Final.jar;D:\apache-maven-3.6.1\respository\com\fasterxml\classmate\1.1.0\classmate-1.1.0.jar;D:\apache-maven-3.6.1\respository\c3p0\c3p0\0.9.1.2\c3p0-0.9.1.2.jar;D:\apache-maven-3.6.1\respository\log4j\log4j\1.2.12\log4j-1.2.12.jar;D:\apache-maven-3.6.1\respository\org\slf4j\slf4j-api\1.6.6\slf4j-api-1.6.6.jar;D:\apache-maven-3.6.1\respository\org\slf4j\slf4j-log4j12\1.6.6\slf4j-log4j12-1.6.6.jar;D:\apache-maven-3.6.1\respository\mysql\mysql-connector-java\5.1.6\mysql-connector-java-5.1.6.jar;D:\apache-maven-3.6.1\respository\org\springframework\data\spring-data-jpa\1.9.0.RELEASE\spring-data-jpa-1.9.0.RELEASE.jar;D:\apache-maven-3.6.1\respository\org\springframework\data\spring-data-commons\1.11.0.RELEASE\spring-data-commons-1.11.0.RELEASE.jar;D:\apache-maven-3.6.1\respository\org\aspectj\aspectjrt\1.8.6\aspectjrt-1.8.6.jar;D:\apache-maven-3.6.1\respository\org\slf4j\jcl-over-slf4j\1.7.12\jcl-over-slf4j-1.7.12.jar;D:\apache-maven-3.6.1\respository\org\springframework\spring-test\5.0.2.RELEASE\spring-test-5.0.2.RELEASE.jar;D:\apache-maven-3.6.1\respository\javax\el\javax.el-api\2.2.4\javax.el-api-2.2.4.jar;D:\apache-maven-3.6.1\respository\org\glassfish\web\javax.el\2.2.4\javax.el-2.2.4.jar" com.intellij.rt.junit.JUnitStarter -ideVersion5 -junit4 cn.itcast.test.ObjectQueryTest,testQuery3
log4j:WARN No appenders could be found for logger (org.springframework.test.context.junit4.SpringJUnit4ClassRunner).
log4j:WARN Please initialize the log4j system properly.
Hibernate: select linkman0_.lkm_id as lkm_id1_1_0_, linkman0_.lkm_cust_id as lkm_cust9_1_0_, linkman0_.lkm_email as lkm_emai2_1_0_, linkman0_.lkm_gender as lkm_gend3_1_0_, linkman0_.lkm_memo as lkm_memo4_1_0_, linkman0_.lkm_mobile as lkm_mobi5_1_0_, linkman0_.lkm_name as lkm_name6_1_0_, linkman0_.lkm_phone as lkm_phon7_1_0_, linkman0_.lkm_position as lkm_posi8_1_0_, customer1_.cust_id as cust_id1_0_1_, customer1_.cust_address as cust_add2_0_1_, customer1_.cust_industry as cust_ind3_0_1_, customer1_.cust_level as cust_lev4_0_1_, customer1_.cust_name as cust_nam5_0_1_, customer1_.cust_phone as cust_pho6_0_1_, customer1_.cust_source as cust_sou7_0_1_ from cst_linkman linkman0_ left outer join cst_customer customer1_ on linkman0_.lkm_cust_id=customer1_.cust_id where linkman0_.lkm_id=?
Customer{custId=1, custName='张三', custSource='null', custIndustry='null', custLevel='null', custAddress='null', custPhone='null'}

Process finished with exit code 0

在这里插入图片描述

D:\JAVA\jdk1.8.0_131\bin\java.exe -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:D:\JAVA\idea\IntelliJ IDEA 2019.3.3\lib\idea_rt.jar=2040:D:\JAVA\idea\IntelliJ IDEA 2019.3.3\bin" -Dfile.encoding=UTF-8 -classpath "D:\JAVA\idea\IntelliJ IDEA 2019.3.3\lib\idea_rt.jar;D:\JAVA\idea\IntelliJ IDEA 2019.3.3\plugins\junit\lib\junit5-rt.jar;D:\JAVA\idea\IntelliJ IDEA 2019.3.3\plugins\junit\lib\junit-rt.jar;D:\JAVA\jdk1.8.0_131\jre\lib\charsets.jar;D:\JAVA\jdk1.8.0_131\jre\lib\deploy.jar;D:\JAVA\jdk1.8.0_131\jre\lib\ext\access-bridge-64.jar;D:\JAVA\jdk1.8.0_131\jre\lib\ext\cldrdata.jar;D:\JAVA\jdk1.8.0_131\jre\lib\ext\dnsns.jar;D:\JAVA\jdk1.8.0_131\jre\lib\ext\jaccess.jar;D:\JAVA\jdk1.8.0_131\jre\lib\ext\jfxrt.jar;D:\JAVA\jdk1.8.0_131\jre\lib\ext\localedata.jar;D:\JAVA\jdk1.8.0_131\jre\lib\ext\nashorn.jar;D:\JAVA\jdk1.8.0_131\jre\lib\ext\sunec.jar;D:\JAVA\jdk1.8.0_131\jre\lib\ext\sunjce_provider.jar;D:\JAVA\jdk1.8.0_131\jre\lib\ext\sunmscapi.jar;D:\JAVA\jdk1.8.0_131\jre\lib\ext\sunpkcs11.jar;D:\JAVA\jdk1.8.0_131\jre\lib\ext\zipfs.jar;D:\JAVA\jdk1.8.0_131\jre\lib\javaws.jar;D:\JAVA\jdk1.8.0_131\jre\lib\jce.jar;D:\JAVA\jdk1.8.0_131\jre\lib\jfr.jar;D:\JAVA\jdk1.8.0_131\jre\lib\jfxswt.jar;D:\JAVA\jdk1.8.0_131\jre\lib\jsse.jar;D:\JAVA\jdk1.8.0_131\jre\lib\management-agent.jar;D:\JAVA\jdk1.8.0_131\jre\lib\plugin.jar;D:\JAVA\jdk1.8.0_131\jre\lib\resources.jar;D:\JAVA\jdk1.8.0_131\jre\lib\rt.jar;D:\ideaPage\JPATest\JPA-3-onetomany\target\test-classes;D:\ideaPage\JPATest\JPA-3-onetomany\target\classes;D:\apache-maven-3.6.1\respository\junit\junit\4.12\junit-4.12.jar;D:\apache-maven-3.6.1\respository\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar;D:\apache-maven-3.6.1\respository\org\aspectj\aspectjweaver\1.6.8\aspectjweaver-1.6.8.jar;D:\apache-maven-3.6.1\respository\org\springframework\spring-aop\5.0.2.RELEASE\spring-aop-5.0.2.RELEASE.jar;D:\apache-maven-3.6.1\respository\org\springframework\spring-context\5.0.2.RELEASE\spring-context-5.0.2.RELEASE.jar;D:\apache-maven-3.6.1\respository\org\springframework\spring-expression\5.0.2.RELEASE\spring-expression-5.0.2.RELEASE.jar;D:\apache-maven-3.6.1\respository\org\springframework\spring-context-support\5.0.2.RELEASE\spring-context-support-5.0.2.RELEASE.jar;D:\apache-maven-3.6.1\respository\org\springframework\spring-orm\5.0.2.RELEASE\spring-orm-5.0.2.RELEASE.jar;D:\apache-maven-3.6.1\respository\org\springframework\spring-jdbc\5.0.2.RELEASE\spring-jdbc-5.0.2.RELEASE.jar;D:\apache-maven-3.6.1\respository\org\springframework\spring-tx\5.0.2.RELEASE\spring-tx-5.0.2.RELEASE.jar;D:\apache-maven-3.6.1\respository\org\springframework\spring-beans\5.0.2.RELEASE\spring-beans-5.0.2.RELEASE.jar;D:\apache-maven-3.6.1\respository\org\springframework\spring-core\5.0.2.RELEASE\spring-core-5.0.2.RELEASE.jar;D:\apache-maven-3.6.1\respository\org\springframework\spring-jcl\5.0.2.RELEASE\spring-jcl-5.0.2.RELEASE.jar;D:\apache-maven-3.6.1\respository\org\hibernate\hibernate-core\5.0.7.Final\hibernate-core-5.0.7.Final.jar;D:\apache-maven-3.6.1\respository\org\jboss\logging\jboss-logging\3.3.0.Final\jboss-logging-3.3.0.Final.jar;D:\apache-maven-3.6.1\respository\org\hibernate\javax\persistence\hibernate-jpa-2.1-api\1.0.0.Final\hibernate-jpa-2.1-api-1.0.0.Final.jar;D:\apache-maven-3.6.1\respository\org\javassist\javassist\3.18.1-GA\javassist-3.18.1-GA.jar;D:\apache-maven-3.6.1\respository\antlr\antlr\2.7.7\antlr-2.7.7.jar;D:\apache-maven-3.6.1\respository\org\apache\geronimo\specs\geronimo-jta_1.1_spec\1.1.1\geronimo-jta_1.1_spec-1.1.1.jar;D:\apache-maven-3.6.1\respository\org\jboss\jandex\2.0.0.Final\jandex-2.0.0.Final.jar;D:\apache-maven-3.6.1\respository\dom4j\dom4j\1.6.1\dom4j-1.6.1.jar;D:\apache-maven-3.6.1\respository\xml-apis\xml-apis\1.0.b2\xml-apis-1.0.b2.jar;D:\apache-maven-3.6.1\respository\org\hibernate\common\hibernate-commons-annotations\5.0.1.Final\hibernate-commons-annotations-5.0.1.Final.jar;D:\apache-maven-3.6.1\respository\org\hibernate\hibernate-entitymanager\5.0.7.Final\hibernate-entitymanager-5.0.7.Final.jar;D:\apache-maven-3.6.1\respository\org\hibernate\hibernate-validator\5.2.1.Final\hibernate-validator-5.2.1.Final.jar;D:\apache-maven-3.6.1\respository\javax\validation\validation-api\1.1.0.Final\validation-api-1.1.0.Final.jar;D:\apache-maven-3.6.1\respository\com\fasterxml\classmate\1.1.0\classmate-1.1.0.jar;D:\apache-maven-3.6.1\respository\c3p0\c3p0\0.9.1.2\c3p0-0.9.1.2.jar;D:\apache-maven-3.6.1\respository\log4j\log4j\1.2.12\log4j-1.2.12.jar;D:\apache-maven-3.6.1\respository\org\slf4j\slf4j-api\1.6.6\slf4j-api-1.6.6.jar;D:\apache-maven-3.6.1\respository\org\slf4j\slf4j-log4j12\1.6.6\slf4j-log4j12-1.6.6.jar;D:\apache-maven-3.6.1\respository\mysql\mysql-connector-java\5.1.6\mysql-connector-java-5.1.6.jar;D:\apache-maven-3.6.1\respository\org\springframework\data\spring-data-jpa\1.9.0.RELEASE\spring-data-jpa-1.9.0.RELEASE.jar;D:\apache-maven-3.6.1\respository\org\springframework\data\spring-data-commons\1.11.0.RELEASE\spring-data-commons-1.11.0.RELEASE.jar;D:\apache-maven-3.6.1\respository\org\aspectj\aspectjrt\1.8.6\aspectjrt-1.8.6.jar;D:\apache-maven-3.6.1\respository\org\slf4j\jcl-over-slf4j\1.7.12\jcl-over-slf4j-1.7.12.jar;D:\apache-maven-3.6.1\respository\org\springframework\spring-test\5.0.2.RELEASE\spring-test-5.0.2.RELEASE.jar;D:\apache-maven-3.6.1\respository\javax\el\javax.el-api\2.2.4\javax.el-api-2.2.4.jar;D:\apache-maven-3.6.1\respository\org\glassfish\web\javax.el\2.2.4\javax.el-2.2.4.jar" com.intellij.rt.junit.JUnitStarter -ideVersion5 -junit4 cn.itcast.test.ObjectQueryTest,testQuery3
log4j:WARN No appenders could be found for logger (org.springframework.test.context.junit4.SpringJUnit4ClassRunner).
log4j:WARN Please initialize the log4j system properly.
Hibernate: select linkman0_.lkm_id as lkm_id1_1_0_, linkman0_.lkm_cust_id as lkm_cust9_1_0_, linkman0_.lkm_email as lkm_emai2_1_0_, linkman0_.lkm_gender as lkm_gend3_1_0_, linkman0_.lkm_memo as lkm_memo4_1_0_, linkman0_.lkm_mobile as lkm_mobi5_1_0_, linkman0_.lkm_name as lkm_name6_1_0_, linkman0_.lkm_phone as lkm_phon7_1_0_, linkman0_.lkm_position as lkm_posi8_1_0_ from cst_linkman linkman0_ where linkman0_.lkm_id=?
Hibernate: select customer0_.cust_id as cust_id1_0_0_, customer0_.cust_address as cust_add2_0_0_, customer0_.cust_industry as cust_ind3_0_0_, customer0_.cust_level as cust_lev4_0_0_, customer0_.cust_name as cust_nam5_0_0_, customer0_.cust_phone as cust_pho6_0_0_, customer0_.cust_source as cust_sou7_0_0_ from cst_customer customer0_ where customer0_.cust_id=?
Customer{custId=1, custName='张三', custSource='null', custIndustry='null', custLevel='null', custAddress='null', custPhone='null'}

Process finished with exit code 0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值