我有一個三路連接的表稱爲Users_Accounts_Roles
。
+--------------+------------+------+-----+-------------------+----------------+
| 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.accounts
與數據填充在Users_Accounts_Roles
當User
是從數據庫中獲取,但我不想改變User.accounts
當User
被持久影響更新Users_Accounts_Roles
。同樣,我希望Account.users
在從數據庫中提取帳戶時使用Users_Accounts_Roles
中的數據填充,但我不希望更改Accounts.users
影響Users_Accounts_Roles
的更新,當Account
持久存在時。 Users_Accounts_Roles
表應該更改的唯一方法是如果User
持續更新accountRoles
字段。
不變,那麼User.accountRoles
映射工作,我喜歡的(無論是從檢索並持續到Users_Accounts_Roles
),但我不能爲User.accounts
找到一種方法和Account.users
到在User
和Account
取檢索,分別,但不持續存在User
或Account
,而不在DAO層中使用某些難看的邏輯。 (他們目前被標記爲瞬態,因爲沒有其他的我嘗試工作)。 Hibernate/JPA支持我想要做什麼?
----- -----編輯
我懷疑爲this tutorial做我的解決方案可以使用@OneToMany(mappedBy="...")
上User.accounts
和Account.users
涉及。然而,我不知道如何註釋AccountRole
和User.accountRoles
字段中的字段,以便對後者的更改仍然存在。