對于mappedBy小結
======引用網上:
a) 隻有OneToOne,OneToMany,ManyToMany上才有mappedBy屬性,ManyToOne不存在該屬性;
b) mappedBy标簽一定是定義在the owned side(被擁有方的),他指向the owning side(擁有方);
c) mappedBy的含義,應該了解為,擁有方能夠自動維護 跟被擁有方的關系;
當然,如果從被擁有方,通過手工強行來維護擁有方的關系也是可以做到的。
d) mappedBy跟JoinColumn/JoinTable總是處于互斥的一方,可以了解為正是由于擁有方的關聯被擁有方的字段存在,擁有方才擁有了被 擁有方。mappedBy這方定義的JoinColumn/JoinTable總是失效的,不會建立對應的字段或者表
======
附加:
有兩個類(兩張表)Group和User,一個組中可以有多個使用者,一個使用者隻屬于一個組,ManyToOne;
兩個類中代碼如下:
Group類中 | User類中 |
@Entity @Table(name="t_Group") public class Group { private int id; private String name; private Set<User> users = new HashSet<User>(); @Id @GeneratedValue public int getId() { return id; } public String getName() { return name; } @OneToMany(mappedBy="group") public Set<User> getUsers() { return users; } public void setId(int id) { this.id = id; } public void setName(String name) { this.name = name; } public void setUsers(Set<User> users) { this.users = users; } } | @Entity @Table(name="t_User") public class User { private int id; private String name; private Group group; @ManyToOne public Group getGroup() { return group; } @Id @GeneratedValue public int getId() { return id; } public String getName() { return name; } public void setGroup(Group group) { this.group = group; } public void setId(int id) { this.id = id; } public void setName(String name) { this.name = name; } } |
@OneToMany(mappedBy="group")
public Set<User> getUsers() {
return users;
}
結果如下:
drop table if exists t_Group drop table if exists t_User create table t_Group ( id integer not null auto_increment, name varchar(255), primary key (id) ) create table t_User ( id integer not null auto_increment, name varchar(255), group_id integer, primary key (id) ) alter table t_User add index FKCB5540D6E7CDA67A (group_id), add constraint FKCB5540D6E7CDA67A foreign key (group_id) references t_Group (id) Hibernate: insert into t_Group (name) values (?) Hibernate: insert into t_User (group_id, name) values (?, ?) |
總結規律為:
凡是雙向關聯,必設MappedBy。