データベースは持続せずにコレクションを取得するために休止状態。の設定は、それが
+--------------+------------+------+-----+-------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+------------+------+-----+-------------------+----------------+
| id | bigint(20) | NO | PRI | NULL | auto_increment |
| user_id | bigint(20) | NO | MUL | NULL | |
| account_id | bigint(20) | NO | | 0 | |
| role_id | bigint(20) | NO | | NULL | |
+--------------+------------+------+-----+-------------------+----------------+
ユーザーは複数のアカウントに所属することができ、それぞれのアカウントに複数の役割を設定できます。
:は、私はまた、User
テーブル
+----------------+--------------+------+-----+---------------------+-----------------------------+
| Field | Type | Null | Key | Default | Extra |
+----------------+--------------+------+-----+---------------------+-----------------------------+
| id | bigint(20) | NO | PRI | NULL | auto_increment |
| email | varchar(255) | NO | UNI | NULL | |
| firstName | varchar(255) | NO | | NULL | |
| lastName | varchar(255) | NO | | NULL | |
+----------------+--------------+------+-----+---------------------+-----------------------------+
Account
テーブル
+--------------+-------------+------+-----+---------------------+-----------------------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------------------+-----------------------------+
| id | bigint(20) | NO | PRI | NULL | auto_increment |
| name | varchar(50) | NO | | NULL | |
+--------------+-------------+------+-----+---------------------+-----------------------------+
とRole
テーブル(まばら)
+--------------+--------------+------+-----+---------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+--------------+------+-----+---------------------+----------------+
| id | bigint(20) | NO | PRI | NULL | auto_increment |
| name | varchar(255) | NO | | NULL | |
| description | text | NO | | NULL | |
+--------------+--------------+------+-----+---------------------+----------------+
オブジェクトを持っています
@Embeddable
AccountRole {
...
@Parent
User getUser() {
return user;
}
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "account_id")
Account getAccount() {
return account;
}
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "role_id")
Role getRole() {
return role;
}
...
}
@Entity
User {
...
@Transient
Set<Account> getAccounts() {
return accounts;
}
@ElementCollection(fetch = FetchType.EAGER)
@JoinTable(name = "Users_Accounts_Roles", joinColumns = @JoinColumn(name = "user_id"))
Set<AccountRole> getAccountRoles() {
return accountRoles;
}
...
}
@Entity
Account {
...
@Transient
Set<User> users;
...
}
私はUser
がデータベースからフェッチされ、私はUser
が永続化されたときにUser.accounts
への変更は、Users_Accounts_Roles
への更新に影響を与えたくないときUser.accounts
はUsers_Accounts_Roles
内のデータが取り込まれたいです。同様に、Account.users
にはUsers_Accounts_Roles
というデータが入力されますが、アカウントがデータベースから取得されたときにAccount
が保持されている場合、Accounts.users
への変更がUsers_Accounts_Roles
への更新に影響しないようにします。 User
が更新されたaccountRoles
フィールドで永続化されている場合は、Users_Accounts_Roles
テーブルを変更する唯一の方法です。
は通りであり、User.accountRoles
マッピングは、(両方から検索し、Users_Accounts_Roles
に永続化)私の好みに合わせて取り組んでいるが、私はUser
とAccount
フェッチ時に取得されるUser.accounts
とAccount.users
ための方法を見つけることができない、それぞれはなく、 User
またはAccount
が持続されても、DAOレイヤーで醜いロジックを使用することなく持続されます。 (私は現在、何も作業をしていないので、Transientとしてマークされています)。私がやろうとしていることをHibernate/JPAがサポートしていますか?
----- ----- EDIT
私はthis tutorialに行ったように私の解決策はUser.accounts
とAccount.users
に@OneToMany(mappedBy="...")
を使用することを含むことが疑われます。しかし、AccountRole
とUser.accountRoles
フィールドのフィールドに注釈を付ける方法を理解することはできません。後者への変更は依然として維持されます。