【问题标题】:How to Map ManyToMany association with join table in JPA如何在 JPA 中将多对多关联与联接表映射
【发布时间】:2023-03-24 14:42:01
【问题描述】:

我的数据库关系

我创建了 3 个 Java 文件来像这样映射。

User.java

@Entity
@Table(name = "user")
public class User {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "user_id" , unique = true)
private int id;

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

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

@Column(name = "last_name")
private String lastName;

@Column(name = "password")
@Transient
private String password;

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

@ManyToOne(fetch = FetchType.LAZY,cascade = CascadeType.ALL)
@JoinTable(name = "user_role", joinColumns = @JoinColumn(name =  "user_id"), inverseJoinColumns = @JoinColumn(name = "role_id"))
private Role role = new Role(); 


public String getUsername() {
    return username;
}

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

public int getId() {
    return id;
}

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

public String getPassword() {
    return password;
}

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

public String getName() {
    return name;
}

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

public String getLastName() {
    return lastName;
}

public void setLastName(String lastName) {
    this.lastName = lastName;
}

public String getEmail() {
    return email;
}

public void setEmail(String email) {
    this.email = email;
}

public Role getRole() {
    return role;
}

public void setRole(Role role) {
    this.role = role;
}

User_Role.java

@Entity
@Table(name = "user_role")
@IdClass(User_Role.class)
public class User_Role implements Serializable {


private static final long serialVersionUID = -5488274192125813525L;

@Id
@Column(name="user_id")
private int user_id;

@Id
@Column(name="role_id")
private int role_id;

@ManyToOne(fetch = FetchType.LAZY ,cascade = CascadeType.ALL)
@JoinColumn(name="user_id" , referencedColumnName = "user_id",insertable=false, updatable=false , foreignKey = @ForeignKey(name = "fkuroleuser"))
private User user = new User();

@ManyToOne(fetch = FetchType.LAZY ,cascade = CascadeType.ALL)
@JoinColumn(name="role_id" , referencedColumnName = "role_id",insertable=false, updatable=false , foreignKey = @ForeignKey(name = "fkurolerole"))
private Role role = new Role() ;

public int getUser_id() {
    return user_id;
}

public void setUser_id(int user_id) {
    this.user_id = user_id;
}

public int getRole_id() {
    return role_id;
}

public void setRole_id(int role_id) {
    this.role_id = role_id;
}

public User getUser() {
    return user;
}

public void setUser(User user) {
    this.user = user;
}

public Role getRole() {
    return role;
}

public void setRole(Role role2) {
    this.role = role2;
}

Role.java

@Entity
@Table(name = "role")
public class Role {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name="role_id" , nullable = true)
private int role_id;

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

public int getId() {
    return role_id;
}
public void setId(int role_id) {
    this.role_id = role_id;
}
public String getRole() {
    return role;
}
public void setRole(String role) {
    this.role = role;
}

我正在尝试使用 JPA 存储库进行添加、删除和更新,但映射实体似乎仍然存在问题。 但是我可以使用此映射查询 jpa 标准。 我不能在我的项目中更改private Role role = new Role(); private User user = new User();

我想知道如何正确映射实体,请给我一些参考。

编辑 现在我的 User.java 喜欢

@Entity
@Table(name = "user")
public class User {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "user_id" , unique = true)
private int id;

@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinTable(name = "user_role", joinColumns = @JoinColumn(name =   "user_id"),inverseJoinColumns = @JoinColumn(name = "role_id"))
private Set<Role> roleList = new HashSet<>();

// getter setter

public User(int user_id,int role_id , String role){

this.id = user_id
this.roleList.add(new Role()); //still not work because can't add data role_id and role
}

【问题讨论】:

标签: java hibernate jpa


【解决方案1】:

您的用户角色关系是ManyToMany。您的user_role 表仅用于映射它们的多对多关联。 因此,您不需要创建额外的实体User_Role。您可以在User 实体中使用ManyToMany 关系,并使用@JoinTable 进行关联映射

把这个改成User.java

    @ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinTable(name = "user_role", 
              joinColumns = @JoinColumn(name =  "user_id"),
              inverseJoinColumns = @JoinColumn(name = "role_id"))
    private List<Role> roleList = new ArrayList<>();

现在,如果您想使这种关系成为双向的,您也可以将其映射到 Role 实体中

    @ManyToMany(mappedBy = "roleList")
    private List<user> userList = new ArrayList<>();

您会发现很多关于这种常见场景的示例和博客。

进一步阅读

【讨论】:

  • 谢谢,这适用于 CRUD,但我对 JPA Criteria 查询有一些问题。当我使用 private Role role = new Role(); 时,如何制作构造函数以从列表中接收数据 role_id(int) 和 role(String)它可以使用this.role.setId(role_id); 获取价值。
  • 您能否详细说明您实际上想要对您的 Criteria 查询做什么?有很多方法@I3eaver
  • 我使用 AJAX 发布一些数据进行查询,然后我收到带有 public User(int user_id,int role_id,String role) 之类的构造函数的查询,并使用 this.id = user_id; 将数据响应,我的问题是如何使用 role_id 、角色来执行此操作?因为它的形式为Set&lt;Role&gt;
  • 我的意思是你想找到什么?比如“我想检查一个用户是否有某个角色”?
  • 检查我的编辑。最后一行只有 1 个问题。我的查询数据工作正常,我可以通过打印检查它们。但无法将数据表单传递给 ajax 响应。
【解决方案2】:

在用户角色中:

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "role_id")
@JsonIgnore
private Role role ;

你的 Role 类可以这样编码:

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "role ")
private List<Role > role = new ArrayList<>();

【讨论】:

    猜你喜欢
    • 2011-01-03
    • 1970-01-01
    • 1970-01-01
    • 2014-04-28
    • 1970-01-01
    • 2015-08-02
    • 1970-01-01
    • 2010-12-12
    • 2012-01-21
    相关资源
    最近更新 更多