二十、Spring boot集成Jpa API

(一)添加依赖

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-jpa</artifactId>
		</dependency>
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<scope>runtime</scope>
		</dependency>

(二)配置数据源和JPA

spring:
    datasource:
        #JDBC配置文件
        name: test
        url: jdbc:mysql://127.0.0.1:3306/tomcat
        username: root
        password: root
        driver-class-name: com.mysql.jdbc.Driver
    jpa:
      database: mysql
      #是否在启动时的时候初始化schema(创建表)---ddl数据库定义语言
      generate-ddl: true
      #显示sql语句
      show-sql: true
      hibernate:
              #      create 每次都先删除表,再创建表
              #      create-drop 每次应用停止,删除表
              #      update 不创建表,保留原有数据
              #      none 不做任何动作
              #      valiad 验证类中的属性与表中的字段是否一致,不一致会报错
              ddl-auto: create-drop

(三)改造启动类,扫描实体对象(扫描要生成表的对象)

/**
 * @EnableJpaRepositories(basePackages = "org.pc"):扫描实体类
 */
@SpringBootApplication
@EnableJpaRepositories(basePackages = "org.pc")
public class JpaApplication {

	public static void main(String[] args) {
		SpringApplication.run(JpaApplication.class, args);
	}
}

(四)实体双向关系
  在JPA中,实体双向关系主要有

  • @OneToOne 一对一
  • @OneToMany 一对多
  • @ManyToOne 多对一
  • @ManyToMany 多对多
      需要注意的是,不管哪种关系,一定要使用mappedBy属性,在受控方设置该对象在主控方的属性,设置主从关系(PS:mappedBy属性设在哪个对象,那么对方就会把这个对象的主键id作为外键)。
    1、@OneToOne (一对一)
    里面涉及到的一些注解如下:
    @Entity:实体名,有这个注解才能保证被映射成表
    @Table(name = “customers”):设置映射表的表名
    @Id:主键
    @GeneratedValue:主键自增
    @Column(length = 200):设置列值长度为200
    @OneToOne(cascade = CascadeType.REMOVE):设置级联删除,在主控方设置
    @OneToOne(mappedBy = “creditCard”):在受控方加该主键,mappedBy:反转控制,即控制权在“creditCard”属性所在的类Customer

以客户(Customer)和信用卡(CreditCard)为例讲解一对一关系:
客户:

/**
 * @Access(value = AccessType.FIELD):注入的时候只通过字段的方式,不通过get()和set()方式
 * @Table(name = "customers"):创建的表名
 */
@Entity
@Access(value = AccessType.FIELD)
@Table(name = "customers")
public class Customer {
    /**
     * @Id:主键
     * @GeneratedValue:主键自增
     */
    @Id
    @GeneratedValue
    private Long id;
    /**
     * @Column(length = 200):设置列值长度为200
     */
    @Column(length = 200)
    private String name;
    /**
     * 设置级联删除,在主控方设置
     */
    @OneToOne(cascade = CascadeType.REMOVE)
    private CreditCard creditCard;
}

信用卡:

/**
 * @author 咸鱼
 * @date 2018/9/29 19:12
 */
@Entity
@Table(name = "credit_cards")
public class CreditCard {
    @Id
    @GeneratedValue
    private Long id;
    @Column(length = 128)
    private String number;
    @Column(name = "reg_date")
    private Date registerDate;
    /**
     * mappedBy:反转控制,即控制权在“creditCard”属性所在的类Customer
     */
    @OneToOne(mappedBy = "creditCard")
    private Customer customer;
}

2、@OneToMany (一对多)和@ManyToOne (多对一)
  这两个注解一般成队出现,一对多或者多对一关系中,一般多方为控制方,一方为受控方。
  这里用到的两个注解:

  • @ManyToOne 多方 主控方
  • @OneToMany(mappedBy = “store”) 一方 受控方

  这里以商店(Store)和客户(Customer)为例进行讲解:
  在客户(Customer)实体中添加商店(Store)对象。

/**
     * 多方
     */
    @ManyToOne
    private Store store;

商店(Store)

@Entity
@Table(name = "stores")
public class Store {
    @Id
    @GeneratedValue
    private Long id;
    private String name;
    /**
     * 一方
     */
    @OneToMany(mappedBy = "store")
    private List<Customer> customers;
}

3、@ManyToMany (多对多)
  这里用到的两个注解:

  • @ManyToMany 主控方
  • @ManyToMany(mappedBy = “books”) 受控方

  这里以书籍(Store)和客户(Customer)为例进行讲解:
  在客户(Customer)实体中添加书籍(Store)对象。

@ManyToMany
    private List<Book> books;

书籍(Store)对象

@Entity
@Table(name = "books")
public class Book {
    @Id
    @GeneratedValue
    private Long id;
    private String name;
    private Date publishDate;
    @ManyToMany(mappedBy = "books")
    private List<Customer> customers;
}

(五)使用JPA进行增删改查
  使用Jpa Api进行增删改查的核心对象是:

/**
     * EntityManager配合@PersistenceContext注解,就相当于Hibernate中的Session对象,自带增删改查
     * 方法
     */
    @PersistenceContext
    private EntityManager entityManager;

  以增加客户为例:
1、  服务层

@Service
public class CustomerService {
    /**
     * EntityManager配合@PersistenceContext注解,就相当于Hibernate中的Session对象,自带增删改查
     * 方法
     */
    @PersistenceContext
    private EntityManager entityManager;

    /**
     * 增加客户
     * @Transactional:JPA规定,默认情况下必须申明事务,否则会报错
     */
    @Transactional
    public Customer addCustomer(Customer customer){
        entityManager.persist(customer);
        return customer;
    }
}

2、改造启动类
  一旦项目中使用到了事务。那么必须在启动类上加上事务管理注解:@EnableTransactionManagement,例:

@SpringBootApplication
@EnableJpaRepositories(basePackages = "org.pc")
@EnableTransactionManagement
public class JpaApplication {
		。。。。。
}

猜你喜欢

转载自blog.csdn.net/panchang199266/article/details/82902208