(一)添加依赖
<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 {
。。。。。
}