一对多、多对一关联:在多方加外键
示例:Group(一方)和User(多方),一个Group可以有多个User,每个User只能属于一个Group
多对一单向关联
在User(多方)中建Group(一方)对象,并添加@ManyToOne注解
1.建Group实体类和User实体类,添加Annotation注解,如下
@Entity@Table(name="_group") //group在MySQL中是关键字,不能直接做表名public class Group {PRivate int id;private String name;@Id@GeneratedValuepublic int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}}
@Entity@Table(name="_user") //为了和表_group保持一致,也用一个别名public class User {private int id;private String name;private Group group;@Id@GeneratedValuepublic int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}@ManyToOne //多对一关联//@JoinColumn(name="groupId") //任意指定生成的外键名public Group getGroup() {return group;}public void setGroup(Group group) {this.group = group;}}
2.在hibernate.cfg.xml中添加mapping语句
<mapping class="com.hibernate.model.Group"/><mapping class="com.hibernate.model.User"/>
3.建Junit测试类
public class ORMappingTest {@Testpublic void test() {new SchemaExport(new Configuration().configure()).create(true, true);}}
程序至此结束,运行程序,在数据库中生成表_group和表_user,并在控制台输出建表语句。
_user表中会自动生成属性名为group_id的外键,可用@JoinColumn注解修改其属性名
一对多单向关联
在Group(一方)中建User(多方)对象,此对象采用Set集合形式
并添加@ManyToOne和@JoinColumn注解(必须添加)
1.建Group实体类和User实体类,添加Annotation注解,如下
@Entity@Table(name="_group") //group在MySQL中是关键字,不能直接做表名public class Group {private int id;private String name;private Set<User> users = new HashSet<User>(); //新建Set集合形式的多方对象users@Id@GeneratedValuepublic int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}@OneToMany //一对多关联@JoinColumn(name="groupId") //若不添加该属性,则会在数据库中生成三张表。public Set<User> getUsers() {return users;}public void setUsers(Set<User> users) {this.users = users;}}
@Entity@Table(name="_user") //为了和表_group保持一致,也用一个别名public class User {private int id;private String name;@Id@GeneratedValuepublic int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}}
2.在hibernate.cfg.xml中添加mapping语句----同上
3.建Junit测试类----同上
程序至此结束,运行程序,会在数据库中生成表_group和表_user,并在控制台输出建表语句
_user表中会生成指定属性名的外键
一对多、多对一双向关联
在User中建Group对象,并添加@ManyToOne注解;在Group中建User对象,并添加@OneToMany注解
1.建Group实体类和User实体类,添加Annotation注解
User类同“多对一单向关联”部分的User类
Group类,如下:
@Entity@Table(name="_group") //group在MySQL中是关键字,不能直接做表名public class Group {private int id;private String name;private Set<User> users = new HashSet<User>();@Id@GeneratedValuepublic int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}@OneToMany(mappedBy="group") //这里的"group"是指User类中的private Group group;public Set<User> getUsers() {return users;}public void setUsers(Set<User> users) {this.users = users;}}
2.在hibernate.cfg.xml中添加mapping语句----同上
3.建Junit测试类----同上
程序至此结束,
运行程序,会在数据库中生成表_group和表_user,并在控制台输出建表语句
_user表中会自动生成属性名为group_id的外键,可用@JoinColumn注解修改其属性名
@mappedBy含义
1.单向关系不需要设置该属性,双向关系必须设置,避免双方都建立外键字段
2.只有OneToOne,OneToMany,ManyToMany上才有mappedBy属性,ManyToOne不存在该属性
3.mappedBy跟JoinColumn/JoinTable总是处于互斥的一方
以Group(一方)和User(多方)为例,
外键在User(多方),@JoinColumn/@JoinTable则只能设置在User(多方)。
则@mappedBy设置在Group(一方)。表明此关联关系是由User(多方)维护的。
新闻热点
疑难解答