数据表在JPA中多对多关联关系的实现

表之间多对多关系的实现

在Java Persistence API (JPA) 中,多对多关系可以通过 @ManyToMany 注解来实现。JPA 提供了一种便捷的方式来表示多对多关联,并通过中间表来维护这种关联。

以下是在 JPA 中实现多对多关系的基本步骤:

  1. 定义实体类:首先,定义两个实体类,分别表示多对多关系的两端。例如,在上面的示例中,“MyUser” 和 “Authority” 分别是两个实体类。

  2. 使用 @ManyToMany 注解:在一个实体类中,使用 @ManyToMany 注解标记另一个实体类的集合属性,表示多对多关联。在示例中,List<Authority> authorityList 是 “MyUser” 类的多对多关联属性。

  3. 指定关联关系的中间表:使用 @JoinTable 注解来指定多对多关系的中间表信息。name 属性指定中间表的名称,joinColumns 属性指定当前实体(“MyUser”)与中间表的关联,inverseJoinColumns 属性指定另一个实体(“Authority”)与中间表的关联。这样,JPA 将自动生成一个中间表来维护两个实体之间的关联关系。

  4. 设置级联操作(可选):您还可以通过设置 cascade 属性来指定级联操作。级联操作可以使得在进行实体关系操作时,相关联的实体也会相应地进行操作。

以下是示例代码的多对多关系实现部分:

@Entity
public class MyUser implements Serializable {
    //...

    @ManyToMany(cascade = {CascadeType.REFRESH}, fetch = FetchType.EAGER)
    @JoinTable(name = "user_authority", joinColumns = @JoinColumn(name = "user_id"),
            inverseJoinColumns = @JoinColumn(name = "authority_id"))
    private List<Authority> authorityList;

    //...
}

@Entity
public class Authority implements Serializable {
    //...
    @ManyToMany(mappedBy = "authorityList")
    private List<MyUser> userList;
    //...
}

通过上述步骤,JPA 将会正确映射多对多关系,并自动创建和维护中间表 “user_authority” 来保存 “MyUser” 和 “Authority” 之间的多对多关联关系。这样,您就能够在应用程序中方便地处理多对多关系的数据操作。

JPA授权表

package com.ch.ch7_1.entity;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

import javax.persistence.*;
import java.io.Serializable;
import java.util.List;

@Entity
@Table(name = "authority")
@JsonIgnoreProperties(value = {"hibernateLazyInitializer"})
public class Authority implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    @Column(nullable = false)
    private String name;

    @ManyToMany(mappedBy = "authorityList")
    @JsonIgnore
    private List<MyUser> userList;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public List<MyUser> getUserList() {
        return userList;
    }

    public void setUserList(List<MyUser> userList) {
        this.userList = userList;
    }
}


JPA用户表

package com.ch.ch7_1.entity;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

import javax.persistence.*;
import java.io.Serializable;
import java.util.List;

@Entity
@Table(name = "user")
@JsonIgnoreProperties(value = {"hibernateLazyInitializer"})
public class MyUser implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    private String username;
    private String password;

    //这里不能是懒加载lazy,否则在MyUserSecurityService的loadUserByUsername方法中获得不到权限
    @ManyToMany(cascade = {CascadeType.REFRESH}, fetch = FetchType.EAGER)
    @JoinTable(name = "user_authority", joinColumns = @JoinColumn(name = "user_id"),
            inverseJoinColumns = @JoinColumn(name = "authority_id"))
    private List<Authority> authorityList;

    //repassword不映射到数据表
    @Transient
    private String repassword;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public List<Authority> getAuthorityList() {
        return authorityList;
    }

    public void setAuthorityList(List<Authority> authorityList) {
        this.authorityList = authorityList;
    }

    public String getRepassword() {
        return repassword;
    }

    public void setRepassword(String repassword) {
        this.repassword = repassword;
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王摇摆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值