使用者嘗試用 Hibernate 多對多自關聯(User ↔ User)實現好友關係,遇到關係表不寫入資料的問題。Hibernate 雙向多對多自關聯配置極易出錯(`mappedBy`、`joinColumns`/`inverseJoinColumns` 易混淆),且查詢會產生龐大 SQL。
// User 實體
@Entity
public class User {
@Id Long id;
String username;
// 單向:一個用戶擁有多個好友關係記錄
@OneToMany(mappedBy = "user")
List friendships;
}
// 關聯實體(中間表)
@Entity
@IdClass(FriendshipPK.class) // 複合主鍵
public class Friendship {
@Id @ManyToOne User user; // 擁有者
@Id @ManyToOne User friend; // 好友
String remark; // 擴展欄位:備註、分組、建立時間等
}
// 複合主鍵類
public class FriendshipPK implements Serializable {
Long user; // 對應 User.id
Long friend; // 對應 User.id
}
// 加好友
Friendship f = new Friendship();
f.setUser(currentUser);
f.setFriend(targetUser);
f.setRemark("同事");
session.save(f);
// 查我的好友
List friends = session.createQuery(
"SELECT f.friend FROM Friendship f WHERE f.user = :me", User.class)
.setParameter("me", currentUser)
.list();
若專案已用 MyBatis,手寫 SQL 更直觀:
結論:**自關聯多對多請拆解為關聯實體 + 一對多**,無論 Hibernate 或 MyBatis 都更穩健、可維護。