ロールエンティティと1対多の関係を持つユーザーエンティティがあります。つまり、1人のユーザーが複数の役割を持つことができます。とにかく、JPQLを使用してクエリを実行すると、Roleエンティティに重複した結果が表示されますROLE_ADMIN
。この場合、2回表示されます。コードをデバッグすると、Roleエンティティが同じメモリIDを持っていることがわかります。
[org.huahsin.Role@1b332d22, org.huahsin.Role@1b332d22]
JPQLで何か間違ったことをしたかどうかはわかりませんでした。私が間違っている場合は私を訂正してください。以下は、この問題に関するいくつかのヒントです。
これは、Usersテーブルで利用可能なコンテンツです。
+----------+----------+---------+
| username | password | enabled |
+----------+----------+---------+
| user7 | user7 | 1 |
+----------+----------+---------+
これは、Usersテーブルのテーブルの説明です。
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| username | varchar(10) | NO | PRI | | |
| password | varchar(32) | YES | | NULL | |
| enabled | int(11) | YES | | NULL | |
+----------+-------------+------+-----+---------+-------+
これは、権限テーブルで使用可能なコンテンツです。
+----------+------------+
| username | authority |
+----------+------------+
| user7 | ROLE_ADMIN |
| user7 | ROLE_USER |
+----------+------------+
これは、権限テーブルのテーブルの説明です。
+-----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| username | varchar(10) | NO | MUL | NULL | |
| authority | varchar(10) | NO | | NULL | |
+-----------+-------------+------+-----+---------+-------+
これは、ユーザーエンティティに対するクエリです。
@NamedQuery(
name="findByUser",
query="select u from User u where u.username in (select r.userId from u.roleList r where r.userId = :username)")
@Entity
@Table(name="users")
public class User {
@Id
private String username;
private String password;
private Integer enabled;
@OneToMany(targetEntity = Role.class, cascade = {CascadeType.ALL})
@JoinColumn(name="username")
private List<Role> roleList;
これはロールエンティティです。
@Entity
@Table(name="authority")
public class Role {
@Id
@Column(name="username")
private String userId;
@Column(name="authority")
private String role;
これが私が結果を取得する方法です:
List<User> l = emf.createEntityManager().createNamedQuery("findByUser", User.class).setParameter("username", username).getResultList();
for( User u : l ) {
System.out.println(u.getUsername());
System.out.println(u.getRoleList());
}
このクエリで何を達成しようとしているのかは明確ではありません。あなたはそのことで、ユーザーをロードする場合username
、およびusername
主キーで次のように、あなたはそれを行うことができます。
User u = em.find(User.class, username);
Role
エンティティが正しくマップされていないため、誤った結果が得られます。userId
はとして注釈が付けられて@Id
いますが、主キーではありません(つまり、一意ではありません)。
データベーススキーマを変更することをお勧めします。User
とRole
(結合テーブルを使用)の間の多対多の関係は、マップするのがはるかに簡単です。
public class User {
...
@OneToMany
@JoinTable(name = "users_authority")
private List<Role> roleList;
...
}
public class Role {
@Id
private String authority;
}
現在のデータベーススキーマが修正されている場合は、次のことを行う必要があります。
authority
複合キー(username
、authority
)があるという事実をを使用して表現します@EmbeddedId
@MapsId
外部キーauthority
(username
)がの複合キーの一部であるという事実を示すために使用しますauthority
参照:
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加