亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 FK“重用”保存實體

使用 FK“重用”保存實體

明月笑刀無情 2024-01-28 16:46:36
我正在使用 Spring + Hibernate JPAA。我有一個實體:A  id (PK)  Set<B> b;  otherProps…B  id (PK)  String name; (unique)  otherProps…并且有一個M到M的表鏈接A.id,B.id。如果用戶創建一個實體:A.id = 0A.b.id = 0A.b.Name = "Admin";它會保存,但會在 B 表中創建一個新條目。將 B 視為系統定義的“角色”表,它不應該改變。所以我希望它重新使用 Admin 并自動填充 id。該對象來自 REST api…在這種情況下調用者是否應該知道 id 和名稱?或者他們應該只能通過 id 或名稱填充?遇到這種情況該如何處理呢?或者把id去掉,用名字作為PK會更好嗎?編輯:澄清...用戶實體角色實體UserRole表與User.Id、Role.Id M2M關系。角色表包含: 1 用戶 2 管理員 3 超級用戶那是我定義的固定表。不允許調用者添加角色。因此,如果User1是用戶,那么M2M表1,1中將會有一個條目?,F在,想象一下如果有人傳入一個角色為“User”的新用戶對象 User2。就像現在一樣,它在 Roles id=4 value=User 中創建一個條目(重復條目),并在 M2M 表中創建一個 1,4,其中預期行為為 1,1,即重用現有的“用戶”角色?;旧希蚁胝{用者知道用戶 id 是有意義的,但我不確定調用者知道角色 id 是否有意義?似乎他們更了解可能的角色。有點像枚舉類型的行為?
查看完整描述

1 回答

?
汪汪一只貓

TA貢獻1898條經驗 獲得超8個贊

如果沒有完整的代碼,很難弄清楚發生了什么。但總的來說,您應該考慮以下概念:


帶注釋的實體JoinTable是關系的所有者。這意味著如果您啟用Cascade.Merge“Owner”,向其中添加新記錄,則會向中間表添加另一條記錄。


一個例子


Role實體:


{

  @ManyToMany(cascade = {CascadeType.MERGE})

    @JoinTable(name = "tb_role_privilege",

            joinColumns = @JoinColumn(name = "role_id"),

            inverseJoinColumns = @JoinColumn(name = "privilege_id"))

    private Set<Privilege> privileges = new HashSet<>();

}

和Privilege實體:


{

      @ManyToMany(mappedBy = "privileges")

    private Set<Role> roles = new HashSet<Role>();

}

這里,Role是關系的所有者。當您使用 創建角色對象 并使用 ,id=0填充其權限列表并ids=[0 1 2]調用 時save,它會將角色記錄插入到 中tb_role,并且還會將 (0,0)、(0,1) 和 (0,2) 插入到中間表tb_role_privilege,但它不會向 中插入任何內容tb_privilege。因此,您需要在tb_privilege插入角色記錄之前插入權限記錄。


這是一種良好且簡單的m2m人際關系方法。如果它不滿足您的場景,請為您的代碼提供更多信息。


查看完整回答
反對 回復 2024-01-28
  • 1 回答
  • 0 關注
  • 117 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號