JPA关联关系


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")
    

   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值