java - Hibernate的mappedBy和ManyToMany

标签 java hibernate maven jpa

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

@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/

相关文章:

java - javax.swing.SwingUtilities.invokeLater 是必要的吗?

java - 如何访问java hibernate Manytomany映射表

java - Spring data jpa存储库通过多元素查找

spring - 启动时Tomcat超时(spring maven hibernate)

maven - 如何将布局方言添加到 spring-boot thymeleaf 自动配置文件中

java - Android SQLite 使用 IN() 进行查询

java - maven 问题 ArtifactDescriptorException

hibernate - 在这种情况下覆盖 Hibernate 延迟加载的最佳方法

maven - 如何解决哪个传递依赖的 POM 指的是已失效的 Maven 存储库?

java - Tapestry 错误 : #does not contain a public constructor needed to autobuild