(5)OneToMany单向、双向manytoone
一、OneToMany单向
OneToMany说明是一个组知道有哪些成员,而成员不知道自己是哪个组(这是类层面的理解)。数据库方面还是多端(User)有外键属性。
若两个表中只写OneToMany,则必须写@JoinColumn(name=”groupId”),否则hibernate会当成多对多建立中间表
Group(一端)
/*
* 一对多,即在一端加
* 并且不需要在多端加外键。
* 和多对一产生相同的表
*
* 首先:补充解释单向[在类设计上]:one to many 就是在1端团队中有哪些人员,但是组员并不知道它属于哪类。不要和数据库存储混
*/
@Entity
@Table(name="_Group")//对表重命名(group是关键字,不能作为表名,所以要对其重命名)
public class Group {
private int id;
private String name;
private Set<User> user=new HashSet<User>();
/*
* 选set的理由:一个组中含有多个用户,它是不同的用户组成的集合。list与数组很像,可以有重复数据。
* map需要个key,这里不用指定。set元素不能重复,也没key最合适
*/
@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")
/*
* 当只写@OneToMany时,hibernate会生成中间表,当成是多对多的关系
* 所以要用@JoinColumn(name="groupId") 一个组多个用户,在多端应有外键组
* 这样就可以产生的是两张表
*/
public Set<User> getUser() {
return user;
}
public void setUser(Set<User> user) {
this.user = user;
}
}
User多端
@Entity
@Table(name="_User")//对表重命名
public class User {
private int id;
private String name;
@Id //必须加在getId上面
@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
在此例中创建是指一组中知道有哪些成员;成员也知道他该属于哪个组。
mappedBy:是指当前类中的关联关系不用考虑,只考虑其对面类即可。在此例中,onetomany不再起主导作用,所以不会再有中间表了。一般来说,都是在manyToone端进行外键关联。
User类
@Entity
@Table(name="_User")//对表重命名
public class User {
private int id;
private String name;
private Group group;
@Id //必须加在getId上面
@GeneratedValue
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@ManyToOne
@JoinColumn(name="gid")//对外键的列重命名
public Group getGroup() {
return group;
}
public void setGroup(Group group) {
this.group = group;
}
}
Group类
/*
* 一对多,即在一端加
* 并且不需要在多端加外键。
* 和多对一产生相同的表
*/
@Entity
@Table(name="_Group")//对表重命名(group是关键字,不能作为表名,所以要对其重命名)
public class Group {
private int id;
private String name;
private Set<User> user=new HashSet<User>();
/*
* 选set的理由:一个组中含有多个用户,它是不同的用户组成的集合。list与数组很像,可以有重复数据。
* map需要个key,这里不用指定。set元素不能重复,也没key最合适
*/
@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")
/*
双向映射,将用户作为主表,在从表中的映射不算,mappedBy=主表中的属性。若不写,则会在user表中产生两个冗余字段:groupId、group_id
这样在生成表时就不考虑onetomany方
*/
public Set<User> getUser() {
return user;
}
public void setUser(Set<User> user) {
this.user = user;
}
}