Hibernate annotation配置方式的MappedBy使用詳解
說是使用詳解,其實是我自己做了一些簡單的試驗.如有說錯,請指正.
Annotation方式的MappedBy其實就是xml方式的inverse
It essential tells hibernate that the key is at the other end of the relationship.
So if there are entities A and B which have a one to one relationship, and you see the mappedBy attribute in A, then the foreign key (which points to A) is stored in B.
但是對于他們的行為 我一直不是很了解 hibernate里的doc解釋也不是很清楚:
其實簡單點說 就是MappedBy確定"維護關系"的一方,也僅僅是"維護關系"而已.其他的操作不影響.
實驗環境:hibernate 3.6.10.Final
實體類:User(多方) Classroom(一方) Many-to-One的測試
- //多方:
- @ManyToOne(cascade=CascadeType.ALL)
- @JoinColumn(name="cid")
- public Classroom getClassroom() {
- return classroom;
- }
- public void setClassroom(Classroom classroom) {
- this.classroom = classroom;
- }
- //一方
- @OneToMany(mappedBy="classroom")
- public Set<User> getUsers() {
- return users;
- }
- public void setUsers(Set<User> users) {
- this.users = users;
- }
從多方插入就不再累述了.
這里就試著從不維護關系的一方來插入:
- User user=new User();
- user.setUname("cc");
- user.setUpass("pass");
- Classroom cr=new Classroom();
- cr.setClassname("class one");
- Set<User> users=new HashSet<User>();
- users.add(user);
- cr.setUsers(users);
這樣只有一條插入語句:
Hibernate: insert into Classroom (cname) values (?)
為了更好地說明問題,我把以上一方的配置進行修改
加入了 cascade=CascadeType.ALL
同樣執行以上代碼 顯示插入了兩條:
Hibernate: insert into Classroom (cname) values (?)
Hibernate: insert into User (cid, uname, upass) values (?, ?, ?)
但是查看數據庫就會發現:
雖然插入了..但是外鍵卻沒有值
一方不維護關系就可以明顯的看出來,
但是一方的其他不影響關系的更新操作是沒有問題的:
- Classroom cr=(Classroom)session.get(Classroom.class, 1);
- System.out.println(cr.getUsers().iterator().next().getUname());
- cr.getUsers().iterator().next().setUname("XX");
執行以上的代碼:
顯示:
Hibernate: select classroom0_.cid as cid1_0_, classroom0_.cname as cname1_0_ from Classroom classroom0_ where classroom0_.cid=?
Hibernate: select users0_.cid as cid1_1_, users0_.uid as uid1_, users0_.uid as uid0_0_, users0_.cid as cid0_0_, users0_.uname as uname0_0_, users0_.upass as upass0_0_ from User users0_ where users0_.cid=?
cc
Hibernate: update User set cid=?, uname=?, upass=? where uid=?
數據在數據庫里也被正常更新
這樣一番實驗坐下來就可以很清楚的感覺到
mappedBy只是確定了由誰來維護關系而已 其他的操作并不影響.
一般情況下 如果要讓兩方都可以維護關系 我自己是在OneToMany后寫JoinColumn 然后和ManyToOne里的外鍵列名取一樣的。
當然也可以不寫JoinColumn 來生成一個第三方表記錄關系 但這樣做沒什么必要 相同的關系會被存兩次.
原文鏈接:http://www.software8.co/wzjs/java/3296.html