Hibernate一对多、多对一关联

一对多、多对一关联:在多方加外键

示例: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

	@GeneratedValue

	public 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

	@GeneratedValue

	public 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 {

	

	@Test

	public 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

	@GeneratedValue

	public 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

	@GeneratedValue

	public 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

	@GeneratedValue

	public 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(多方)维护的。

你可能感兴趣的:(Hibernate)