上一篇的狀況是一個使用者可以開多個飯局邀請其他使用者加入,是一對多,而一個使用者可以加入多個飯局,一個飯局也可以有多個使用者加入,形成了 USERS 和 APPOINTMENT 間的多對多關係。在關聯式資料庫中就會如上圖,多出第三方的 table,用來記錄多對多的關係。
在 JPA 中要怎麼表示這種多對多的關係? 修改 class Appointment 如下:
1 @Entity 2 @Table( 3 name="APPOINTMENT", 4 uniqueConstraints = { 5 @UniqueConstraint(columnNames = "SYSID") 6 }) 7 public class Appointment implements Serializable { 8 private static final long serialVersionUID = -3781642274581820116L; 9 10 private String email; 11 private String name; 12 private Long restaurant_sysid; 13 private String description; 14 private byte[] photo; 15 private Integer people; 16 private Integer willPay; 17 private String payKind; 18 private String cancel; 19 private Date htime; 20 private Date ctime; 21 22 @ManyToOne(fetch = FetchType.LAZY) 23 @JoinColumn(name = "email", insertable = false, updatable = false) 24 private Users users; 25 26 @ManyToMany(fetch = FetchType.LAZY) 27 @JoinTable(name = "PARTICIPANT", 28 joinColumns = { @JoinColumn(name = "APPOINTMENT_SYSID") }, 29 inverseJoinColumns = { @JoinColumn (name = "EMAIL") }) 30 private List<Users> particpants; 31 32 //省略 33 34 public Users getUsers() { 35 return users; 36 } 37 38 public void setUsers(Users users) { 39 this.users = users; 40 } 41 42 public List<Users> getParticpants() { 43 return particpants; 44 } 45 public void setParticpants(List<Users> particpants) { 46 this.particpants = particpants; 47 } 48 }
- 第24行: 這個 users 是指開飯局的人,只會有一個,是多對一的關係。
- 第30行: 這是參與飯局的人,可以有多個,是多對多的關係,在 JPA 中使用 @ManyToMany 來設定,JoinTable 中的 name 屬性為第三方的 table,joinColumns 屬性是第三方 table 與 table APPOINTMENT 間的對應欄位,inverseJoinColumns 則是第三方 table 與多方的另一邊 (table USERS) 的對應欄位。
要特別注意第1行一定要加 @Transactional,因為上面程式第26行是設定為 FetchType.LAZY,在執行下面程式第4行時只會讀取 table APPOINTMENT 的資料,要到第 6 行真的使用到 Users 的資料時,才會再到資料庫將 table USERS 中的相關資料取出來,在 JPA 的 CRUD 中,都要有 transaction 才能讀取,所以測試程式要加 @Transactional 才會有動作,不加雖然不會產生錯誤,但實際上沒有到資料庫讀資料。
1 @Transactional 2 @Test 3 public void testFindFromAppointment() { 4 Appointment a = daoApp.find("hi.steven@gmail.com"); 5 6 for(Users u:a.getParticpants()) { 7 System.out.println(u.toString()); 8 } 9 }
【日劇 - 夏目漱石之妻】
尾野真千子主演只有四集的連續劇,改編自夏目漱石老婆 (中根鏡子 -> 夏目鏡子) 所著的「漱石的回憶」。從這部戲可以看到,19世紀末,那個嚴重男尊女卑的社會,女人選擇婚姻,就像賭博一樣,而且是把全部的身家都拿出來賭,是一場貫穿後半輩子的豪賭。
片中夏目漱石 (長谷川博己 飾) 是個精神耗弱且會家暴的大男人,這種家暴在當時的日本社會可能是很平常的事吧? 他老婆看來沒有太不能接受。陪著一個這麼不懂體貼又會家暴的男人幾十年,不知道她覺得自己是否賭對了? 從影片最後一幕的劇情來看,是要說她賭對了吧?! 雙方最後還是挺恩愛的,不過,以21世紀的價值觀來看,這樣的婚姻恐怕是沒那麼幸福。
即使到了20世紀末,年輕男女到了適婚年齡都會面臨強大的社會、家庭壓力,壓迫著這些未婚男女走入婚姻,還把「白頭偕老」當成重大成就,而實際上很多人同住一個屋簷下,彼此間並沒有太多感情,就算白頭偕老,也沒有幸福感。還好,至少現在的台灣社會這樣的困擾不再那麼嚴重,想單身、想在一起卻不結婚 … 都可以,來自社會、家庭的壓力比以前小多了,可以更自由的選擇自己的人生。