2017-01-16 5 views
0

私は最初から新しいプロジェクトを始めています。私はこの問題を解決できません。私には3つの実体があり、それらはすべて互いに数多くの関係を持っています。シトHibernate mappedBy and ManyToMany

@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 = "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 = "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()+ 
       '}'; 
    } 
} 

私はmappedBYについて次のエラーを取得するのmavenでコンパイルしてみてください、まるでそれが関係の両側に書かれているかのように、実際に片面のみに書かれています:

org.hibernate.AnnotationException:関係の両側でmappedByが不正に使用されています:User.users_cluster

誰かが間違っていることを知っていますか?

+1

ユーザーからリストまでの関係がクラスユーザー(それ自身)にマップされていることを、hibernateに伝えました。これは、ある種の再帰を作成します。この場合、mappedBy属性を使用することはできません。エンティティAとエンティティBの間に関係があり、どちらの側が所有者であるかを知るために使用されます。しかし、あなたはエンティティUserからそれ自身へのリレーションシップを持っています。 mappedByでオーナーを定義することは意味がありません(少なくとも私にとって)。 –

+1

ところであなたのエンティティがモデリングしていることを本当に理解していないのですが、3つのエンティティにはManyToMany関係がありますが、Userでは2つのManyToMany関係しかありません。ユーザーがリストとリストを持っていてはならないのですが、リストの代わりにリスト2がありますか? –

答えて

2

私の知る限りClusterエンティティの命名規則の一部雌牛を除いて正しく注釈されて見ることができるよう

Clustor

。代わりに

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 
} 

あなたの3つのエンティティは、必要に応じて相互に関連している必要があります。

関連する問題