Jpa 相关注解

1. 一对一关联

现假设有Person表和Address表,是一对一的关系,在Person中有一个指向Address表主键的字段addressID,所以主控方一定是Person,所谓主控方就是能改变关联关系的一方,Person只要改变addressID就改变了关联关系,所以Person是主控方,所以@JoinColumn写在Person类中

@Data
@Entity
@Table(name = "person")
public class Person{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private String id;

    @Column(name = "address_id")
    private String addressId;

    @OneToOne(cascade=CascadeType.ALL,optional=true)
    @JoinColumn(name="address_id")//注释本表中指向另一个表的外键。
    private Address address;

}

2、一对多单向关联

若Person和Address表是一对多的关系,则表示一个Person下包含多个Address,即在Address表中包含person_id字段。

一对多的关系,所以站在一的角度,也就是Person的角度,在Person类中加入@JoinColumn。

@Data
@Entity
@Table(name = "person")
public class Person{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private String id;

    @OneToMany(cascade=CascadeType.ALL) 
    @JoinColumn(name="person_id")//注释的是另一个表指向本表的外键。
    private List<Address> addresss;

}

3、多对一的关联关系

若Person和Address表是一对多的关系,则表示一个Person下包含多个Address,即在Address表中包含person_id字段。

多对一的关系,所以站在多的角度,也就是Address的角度,在Address类中加入@JoinColumn

@Data
@Entity
@Table(name = "address")
public class Address{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private String id;

    @Column(name = "address")
    private String address;

    @ManyToOne
    @JoinColumn(name="person_id")//注释的是本表的外键。
    private Person person;

}

4、使用中间表的一对多关联

Person、Pserson_Address、Address三张表,Person和Address为一对多关系,则配置如下

@Data
@Entity
@Table(name = "person")
public class Person{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private String id;

    @OneToMany(cascade = CascadeType.ALL)
    @WhereJoinTable(clause = "status = 1")
    @JoinTable(name = "person_address", 
        joinColumns = {@JoinColumn(name = "person_id")}, 
        inverseJoinColumns = {@JoinColumn(name = "address_id")})
    private List<Address> addresss;

}

JoinTable 中 name指中间表名称,joinColumns指定中间表中关联自己ID的字段,inverseJoinColumns表示中间表中关联对方ID的字段;多对一的翻过来即可。WhereJoinTable(clause = "status = 1") 表示筛选中间表status=1的字段进行连接查询。

5、一对多双向

单向一对多关系:是一包含多方的信息,而多方没有一方的信息,即在Address方无Person信息。只需在Address类中加入多对一的注解即可

@Data
@Entity
@Table(name = "address")
public class Address{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private String id;

    @Column(name = "address")
    private String address;

    @ManyToOne(cascade = CascadeType.ALL, optional = false)
    @JoinColumn(name="person_id")
    private Person person;

}

6、多对多单向关系

多对多的关系都是以中间表的形式进行维护,如Person Person_Address Address三者的关系,Person和Address为多对多关系。

@Data
@Entity
@Table(name = "person")
public class Person{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private String id;

    @ManyToMany(cascade=CascadeType.ALL) 
    @WhereJoinTable(clause = "status = 1")
    @JoinTable(name = "person_address", 
        joinColumns = {@JoinColumn(name = "person_id")},
        inverseJoinColumns = {@JoinColumn(name = "address_id")})
    private List<Address> addresss;

}

则在Address表中6亦可进行相关配置。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值