首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

JavaWeb 一對一雙向關聯表插入策略:補償更新或冗余字段消除

     編輯:程式設計綜合問答

場景

Teacher(1) ↔ Class(1) 雙向外鍵:
Teacher.classId → Class.id
Class.teacherId → Teacher.id

插入困境

雙方主鍵均為自增,插入一方後需另一方 ID 回填,形成循環依賴。

方案對比

方案步驟優點缺點
補償 UPDATE1. INSERT Teacher → get id
2. INSERT Class(teacherId) → get id
3. UPDATE Teacher SET classId=?
邏輯直觀,符合現有表結構兩次寫入,事務管理稍繁瑣
單向外鍵 + 視圖僅在 Class 保留 teacherId,Teacher 去掉 classId。查詢時用 View 關聯插入簡單,無循環需修改表結構,視圖更新有限制
聯合主鍵/共享主鍵Class.id 同時作為 PK 和 FK 指向 Teacher.id天然一對一,無額外外鍵列業務語義綁定,擴展性差

推薦做法

若表結構不可變,**補償 UPDATE** 是唯一選擇,建議在服務層用事務包裹:

@Transactional
public void addTeacherAndClass(Teacher t, Class c) {
    teacherDao.insert(t);           // 回填 t.id
    c.setTeacherId(t.getId());
    classDao.insert(c);             // 回填 c.id
    t.setClassId(c.getId());
    teacherDao.update(t);           // 補充 classId
}

最佳實踐

  • **優先設計為單向關聯**,按業務主從關係決定外鍵歸屬(如 Class 從屬 Teacher,只在 Class 存 teacherId)。
  • 雙向導航在 ORM 映射中配置即可(mappedBy),數據庫層面單向外鍵足矣。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved