Jpa中註解一些引數含義
阿新 • • 發佈:2018-11-11
Cascade
在使用@OneToMany
時,建立了一個user(1)對message(n)的關係,事先已經插入了一個user,當想為這個user(id為1)插入一條訊息時程式碼如下
Message message = new Message("abc",new Date(),new Date(),1.2,1.2,1,1);
User user = new User();
user.setId(1L);
message.setUser(user);
msgRepo.save(message);
執行時報錯:
...detached entity passed to persist:(your Entity)
大概問題就是說user未能進行持久化(persist
),仔細一想,這是兩個級聯實體,是不是級聯設定出了問題,原來,我直接使用了CascadeType.ALL
,這種做法實在不是個好習慣,因為裡面有一個CascadeType.PERSIST
是級聯實體同時實體化,而我們資料庫中已經有一個id=1
的user
,這裡又出現一個,主鍵重複,導致持久化出錯,而且這也不是我們的意圖,我們是隻想持久化Message
,所以Cascade中應該去除CascadeType.PERSIST
。
更詳細CascadeType 看這裡。
mappedBy
mappedBy
指向是不負責維護關係的實體,例如user
和message
是一對多的關係,message
負責維護關係,則應該在user
中指出mappedBy = "user"
值為表名。
當然並不一定要用mappedBy,加入mappedBy可以避免多生成一張中間表
舉例解釋:點這裡。
FetchType
我不怎麼生產博文,經常做博文的搬運工。