表之间多对多关系的实现
在Java Persistence API (JPA) 中,多对多关系可以通过 @ManyToMany
注解来实现。JPA 提供了一种便捷的方式来表示多对多关联,并通过中间表来维护这种关联。
以下是在 JPA 中实现多对多关系的基本步骤:
-
定义实体类:首先,定义两个实体类,分别表示多对多关系的两端。例如,在上面的示例中,“MyUser” 和 “Authority” 分别是两个实体类。
-
使用
@ManyToMany
注解:在一个实体类中,使用@ManyToMany
注解标记另一个实体类的集合属性,表示多对多关联。在示例中,List<Authority> authorityList
是 “MyUser” 类的多对多关联属性。 -
指定关联关系的中间表:使用
@JoinTable
注解来指定多对多关系的中间表信息。name
属性指定中间表的名称,joinColumns
属性指定当前实体(“MyUser”)与中间表的关联,inverseJoinColumns
属性指定另一个实体(“Authority”)与中间表的关联。这样,JPA 将自动生成一个中间表来维护两个实体之间的关联关系。 -
设置级联操作(可选):您还可以通过设置
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;
}
}