【问题标题】:Hibernate mappedBy and ManyToManyHibernate mappedBy 和 ManyToMany
【发布时间】:2017-01-16 17:10:53
【问题描述】:

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

@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

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

【问题讨论】:

  • 你告诉hibernate你从用户到列表的关系映射到类用户(本身)。这将创建某种递归。在这种情况下,我认为您不能使用 mappedBy 属性。当实体 A 和 B 之间存在关系时,通常使用它来判断哪一方是所有者。但是你有一个从实体用户到它自己的关系。用 mappedBy 定义所有者没有意义(至少对我而言)。
  • 顺便说一句:虽然我不太了解您的实体在建模什么,但您写道,您的 3 个实体彼此之间具有多对多关系,但在用户中它与自身只有 2 个多对多关系。 User 不应该有一个 List 和 List 而不是两个 List

标签: java hibernate maven jpa


【解决方案1】:

集群

据我所知,Cluster 实体已正确注释,除了一些命名约定。而不是

private List<User> users_cluster;

我会推荐使用

private List<User> users;

该列表包含用户,因此应该命名以反映这一点;好的命名是最好的文档,(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
}

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

【讨论】:

    猜你喜欢
    • 2012-12-16
    • 1970-01-01
    • 2013-10-31
    • 2014-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-11
    • 1970-01-01
    相关资源
    最近更新 更多