gpt4 book ai didi

java - Hibernate的mappedBy和ManyToMany

转载 作者:行者123 更新时间:2023-12-02 03:06:22 25 4
gpt4 key购买 nike

我正在从头开始一个新项目,但我遇到了这个我无法解决的问题。我有三个实体,它们彼此之间都有多对多关系。有集群:

@Entity
@Component
@Table(name = "clusterEntity")
public class Cluster {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", nullable = false, updatable = false)
private Long id;

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

public Long getId() {
return id;
}

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

public String getName() {
return name;
}

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

@ManyToMany
@JoinTable(name="cluster_user",
joinColumns=@JoinColumn(name="cluster_id", referencedColumnName="id"),
inverseJoinColumns=@JoinColumn(name="user_id", referencedColumnName="id"))
private List<User> users_cluster;

@ManyToMany
@JoinTable(name="cluster_sito",
joinColumns=@JoinColumn(name="cluster_id", referencedColumnName="id"),
inverseJoinColumns=@JoinColumn(name="sito_id", referencedColumnName="id"))
private List<Sito> sitos;

@Override
public String toString() {
return "Cluster{" +
"id=" + id +
", name='" + name +
", users='" + users_cluster.toString() +
'}';
}
}

这是用户:

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

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", nullable = false, updatable = false)
private Long id;

@Column(name = "email", nullable = false, unique = true)
private String email;

@Column(name = "password_hash", nullable = false)
private String passwordHash;

@Column(name = "role", nullable = false)
@Enumerated(EnumType.STRING)
private Role role;

@Column(name = "G1", nullable = true)
private String G1;

@Column(name = "G2", nullable = true)
private String G2;

@Column(name = "G3", nullable = true)
private String G3;

@Column(name = "G4", nullable = true)
private String G4;

@Column(name = "G5", nullable = true)
private String G5;

@Column(name = "G6", nullable = true)
private String G6;

@Column (name = "access_token", nullable = true)
private String access_token;

@Column (name = "refresh_token", nullable = true)
private String refresh_token;

public Long getId() {
return id;
}

public String getEmail() {
return email;
}

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

public String getPasswordHash() {
return passwordHash;
}

public void setPasswordHash(String passwordHash) {
this.passwordHash = passwordHash;
}

public Role getRole() {
return role;
}

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

public String getG1() {
return G1;
}

public void setG1(String g1) {
G1 = g1;
}

public String getG2() {
return G2;
}

public void setG2(String g2) {
G2 = g2;
}

public String getG3() {
return G3;
}

public void setG3(String g3) {
G3 = g3;
}

public String getG4() {
return G4;
}

public void setG4(String g4) {
G4 = g4;
}

public String getG5() {
return G5;
}

public void setG5(String g5) {
G5 = g5;
}

public String getG6() {
return G6;
}

public void setG6(String g6) {
G6 = g6;
}

public String getAccess_token() {
return access_token;
}

public void setAccess_token(String access_token) {
this.access_token = access_token;
}

public String getRefresh_token() {
return refresh_token;
}

public void setRefresh_token(String refresh_token) {
this.refresh_token = refresh_token;
}

@ManyToMany(mappedBy="users_cluster")
private List<User> users_cluster;

@ManyToMany(mappedBy="users_sito")
private List<User> users_sito;

public User(){}

@Override
public String toString() {
return "User{" +
"id=" + id +
", email='" + email.replaceFirst("@.*", "@***") +
", passwordHash='" + passwordHash.substring(0, 10) +
", role=" + role +
'}';
}
}

这是西托:

@Entity
@Component
@Table(name = "sitoEntity")
public class Sito {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", nullable = false, updatable = false)
private Long id;

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

public Long getId() {
return id;
}

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

public String getName() {
return name;
}

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

@ManyToMany
@JoinTable(name="sito_user",
joinColumns=@JoinColumn(name="sito_id", referencedColumnName="id"),
inverseJoinColumns=@JoinColumn(name="user_id", referencedColumnName="id"))
private List<User> users_sito;

@Override
public String toString() {
return "Sito{" +
"id=" + id +
", name='" + name+
", users='" + users_sito.toString()+
'}';
}
}

当我尝试使用maven编译时,我收到以下关于mappedBY的错误,就好像它写在关系的两侧,但实际上它只写在一侧:

原因:org.hibernate.AnnotationException:在关系双方非法使用mappedBy:User.users_cluster

有人知道我做错了什么吗?

最佳答案

集群

据我所知,除了某些命名约定之外,Cluster 实体的注释是正确的。而不是

private List<User> users_cluster;

我建议使用

private List<User> users;

该列表包含用户,因此应该对其进行命名以反射(reflect)这一点;好的命名是最好的文档,(imo)。

用户

该实体似乎注释正确,但引用是错误的,因为它们是自引用。因此,如果要在三个实体之间创建多对多关系,应该对实体进行如下修改:

public class User {

// ...

@ManyToMany(mappedBy="users")
private List<Cluster> clusters;

@ManyToMany(mappedBy="users")
private List<Sito> sitos;

// getters + setters


}

西托

这里我也做了一个小修改,如下:

public class Sito {

// ...

@ManyToMany
@JoinTable(name="sito_user",
joinColumns=@JoinColumn(name="sito_id", referencedColumnName="id"),
inverseJoinColumns=@JoinColumn(name="user_id", referencedColumnName="id"))
private List<User> users;

@ManyToMany(mappedBy = "sitos")
private List<Cluster> clusters;


// getters + setters
}

现在您的三个实体应该按照您的需要相互关联。

关于java - Hibernate的mappedBy和ManyToMany,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41681554/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com