2016-04-09 14 views
0

私は2つの単純なテーブルUserとUser_Rolesを持っています。私は、フィールドemailを持っていると私はUserEntityから負荷User_Rolesをしたい両方のテーブルに は、クエリは次のようになります。JPA - エンティティ@OneToOneのマッピングの繰り返し列

SELECT * 
    FROM Users u, User_Roles ur 
WHERE u.email = ur.email; 

私は「リンク」私はエラーを取得し、電子メールフィールドは、「エンティティのマッピングでコラムを繰り返ししようとすると、 :UserEntityカラム:email "

私は組み合わせのいずれかの種類(mappedBy、refColumnなど)を追加しようとしましたが、エラーが同じであっても...

ユーザー

@Entity 
@Table(name = "users") 
public class UserEntity implements Serializable { 

    private static final long serialVersionUID = 1L; 

    private long id; 
    private String email; 
    private UserRolesEntity roles; 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    public long getId() { 
     return id; 
    } 
    public void setId(long id) { 
     this.id = id; 
    } 

    @Basic 
    public String getEmail() { 
     return email; 
    } 
    public void setEmail(String email) { 
     this.email = email; 
    } 

    @OneToOne 
    @JoinColumn(name = "email") 
    public UserRolesEntity getRoles() { 
     return roles; 
    } 
    public void setRoles(UserRolesEntity roles) { 
     this.roles = roles; 
    } 
} 

User_Roles

@Entity 
@Table(name = "user_roles") 
public class UserRolesEntity { 

    private long id; 
    private String email; 
    private String role; 

    @Id 
    @Column(name = "user_role_id") 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    public long getId() { 
     return id; 
    } 

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

    @Basic 
    public String getEmail() { 
     return email; 
    } 
    public void setEmail(String email) { 
     this.email = email; 
    } 

    @Basic 
    public String getRole() { 
     return role; 
    } 
    public void setRole(String role) { 
     this.role = role; 
    } 
} 
+0

あなたは1-1の関係を持っているので、NE UserRolesEntityクラスのFKを編集しました。タイプLONGのアイデンティティーを持つものにForeignKeyとしてSTRINGフィールドを使用することはできません! –

+0

私はこのようなことを疑っていました....以前はFKの注釈を使用していましたが....あなたはUserRolesEntityを修正する必要があると教えてください。次はその上で、私は将来のあなたのソリューションを勉強します...ありがとうたくさん... – Mistre83

+0

変更?他のクラスから@JoinColumn(name = "email")を削除します。 1-1のリレーションはJPAドキュメントにあります –

答えて

0

ですUser_RolesとUserをリンクする場合は、User_Rolesにユーザーの主キーを保持する必要があります。だから、より良い、このようなあなたのUser_Rolesテーブルを変更します:

long user_role_id 
long user 
String role 

その後、あなたのUser_Rolesクラスは次のようになります。

@Entity 
@Table(name = "user_roles") 
public class UserRolesEntity { 

private long id; 
private User user; 
private String role; 

@Id 
@Column(name = "user_role_id") 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
public long getId() { 
    return id; 
} 

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

@OneToOne 
public User getUser() { 
    return user; 
} 
public void setUser(String user) { 
    this.user = user; 
} 

@Basic 
public String getRole() { 
    return role; 
} 
public void setRole(String role) { 
    this.role = role; 
} 
} 

あなたはUSER_ROLEからユーザーのメールを取得したい場合、あなたはこのように行うことができます:userRole.getUser().getEmail()

そして、Userクラスは次のようになります。

@Entity 
@Table(name = "users") 
public class UserEntity implements Serializable { 

private static final long serialVersionUID = 1L; 

private long id; 
private String email; 
private UserRolesEntity roles; 

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
public long getId() { 
    return id; 
} 
public void setId(long id) { 
    this.id = id; 
} 

@Basic 
public String getEmail() { 
    return email; 
} 
public void setEmail(String email) { 
    this.email = email; 
} 

@OneToOne(mappedBy="user") 
public UserRolesEntity getRoles() { 
    return roles; 
} 
public void setRoles(UserRolesEntity roles) { 
    this.roles = roles; 
} 
}