2017-01-16 103 views
0

我从头开始一个新的项目,我得到了这个问题,我无法解决。我有三个实体,他们彼此之间都有很多很多的关系。还有就是集群:休眠mappedBy和ManyToMany

@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", 
      [email protected](name="cluster_id", referencedColumnName="id"), 
      [email protected](name="user_id", referencedColumnName="id")) 
    private List<User> users_cluster; 

    @ManyToMany 
     @JoinTable(name="cluster_sito", 
      [email protected](name="cluster_id", referencedColumnName="id"), 
      [email protected](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", 
      [email protected](name="sito_id", referencedColumnName="id"), 
      [email protected](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以下错误编译,就好像它写在关系的两边,但实际上它只写在一边:

Caus编辑:org.hibernate.AnnotationException:非法使用mappedBy在关系两边:User.users_cluster

任何人都有任何想法我做错了什么?

+1

你已经告诉休眠,你从用户到列表的关系被映射到类用户(本身)。这会产生某种递归。我不认为你可以在这种情况下使用mappedBy属性。它通常在实体A和B之间存在关系时告诉哪一方是所有者。但是你有一个从实体用户到自己的关系。用mappedBy定义一个所有者是没有意义的(至少对我来说)。 –

+1

顺便说一句:虽然我不太了解你的实体正在建模什么,但你写了3个实体具有彼此的ManyToMany关系,但在用户中它与它自己只有2个ManyToMany关系。应该不是用户列表和列表而不是两个列表? –

回答

2

Clustor

至于我可以看到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 


} 

这里也是我做了一个小的修改如下:所以,如果你想创建THRE实体之间的许多一对多的关系如下实体应修改

public class Sito { 

    // ... 

    @ManyToMany 
    @JoinTable(name="sito_user", 
      [email protected](name="sito_id", referencedColumnName="id"), 
      [email protected](name="user_id", referencedColumnName="id")) 
    private List<User> users; 

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


    // getters + setters 
} 

现在你的三个实体应该如你所愿相互关联。