1、idea构建Spring工程(勾选SQL中Spring Data JPA next)
2、配置application.yaml
#配置数据源
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false
username: root
password: root
#配置JPA
jpa:
#设置方言
database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
#显示sql语句
show-sql: true
hibernate:
ddl-auto: update
#更改命名规范(默认驼峰命名)
naming:
physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
3、编写实体类
import org.springframework.format.annotation.DateTimeFormat;
import javax.persistence.*;
import java.util.Date;
@Entity
@Table(name="userinfo")
public class UserInfo {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="userId")
private Integer userId;
@Column(name="userName",length = 20)
private String userName;
@Column(name="userPwd",length = 32)
private String userPwd;
@DateTimeFormat(pattern = "yyyy-MM-dd")
@Temporal(TemporalType.DATE)
private Date borndate;
setter/getter省略
}
4.编写dao
public interface UserInfoDao extends JpaRepository<UserInfo,Integer> {
}
5.编辑测试类以及测试方法
6.Spring-Data-JPA关联关系
1、一对一
2、一对多
3、多对一
4、多对多
一对一
举例公民对身份证
public class UserInfo {
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "card_id",referencedColumnName = "cardId")
private Card card;
}
//Cascade:级联操作
ALL:所有的级联操作(增删改查[CRUD])
DETECH:将另一方一同设置为游离状态
MERGE\REFRESH:代表更新操作
DELETE:删除
//Fetch:加载策略
EAGER:即时获取
LAZY:延迟加载(什么时候使用,什么时候加载,有可能会跑出no session异常。)
一对多
@OneToMany(cascade = {CascadeType.PERSIST,CascadeType.MERGE,CascadeType.REFRESH})
//JoinColumn代表着建立外键关系。如果该项不存在,在JPA中,会建立第三张主外键维护表。
@JoinColumn(name="gradeNO")
private Set<Student> students = new HashSet<>() ;
多对一
@ManyToOne(cascade = {CascadeType.MERGE,CascadeType.REFRESH})
//JoinColumn在设置时,如果有双向关系,该键的名称必须与一的一方的名称要一致!
@JoinColumn(name="gradeNO")
private Grade grade ;
多对多
@ManyToMany(mappedBy = "programs",cascade = CascadeType.ALL,fetch = FetchType.EAGER)
private Set<Programmer> programmers = new HashSet<>() ;
//另一个类注解很简单
@ManyToMany
private Set<Program> programs = new HashSet<>() ;
注意数据库表字段名和实体类不匹配的错误
我的解决方案,
1、明确指定命名规范
2、明确指定
@JoinColumn(name = "gradeNo",referencedColumnName = "gradeNo")