不管是双向还是单向关联,数据库表的设计是一样的,一般都是在N的一方增加外键(如果在1的一方增加外键势必会造成冗余)
单向N-1关联
以Group和User为例,一个Group可以有多个User,一个User只能对应一个Group,典型的一对多(多对一)的案列
Annotation方式
对于N-1关联(无论单向还是双向),都需要在N的一方给关联属性加上@ManyToOne注解
@ManyToOne注解有以下属性:
属性 | 是否必需 | 说明 |
---|---|---|
cascade | 否 | 指定Hibernate对关联实体采用的级联策略 |
fetch | 否 | 指定抓取关联实体时的抓取策略,该属性值有FetchTyoe.LAZY和FetchType.EAGER(@ManyToOne注解的默认值),LAZY是指真正用到关联实体才会去数据库获取 |
optional | 否 | 该属性指定关联关系是否可选 |
targetEntity | 否 | 该属性指定关联实体的类名,默认情况下,Hibernate将通过反射来判断关联实体的类名 |
User实体:
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
@Entity
@Table(name="t_user")
public class User {
private int id;
private String name;
private Group group;
@Id
@GeneratedValue
public int getId() {
return id;
}
@Column(length=50)
public String getName() {
return name;
}
//关联实体属性加上@ManyToOne注解
@ManyToOne
//指定映射的外键字段
@JoinColumn(
name="group_id",
referencedColumnName="id",
unique=false
)
public Group getGroup() {
return group;
}
public void setGroup(Group group) {
this.group = group;
}
public void setId(int id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
}
Group实体:
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name="t_group")
public class Group {
private int id;
private String name;
private String description;
@Id
@GeneratedValue
public int getId() {
return id;
}
@Column(length=50)
public String getName() {
return name;
}
public String getDescription() {
return description;
}
public void setId(int id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void setDescription(String description) {
this.description = description;
}
}
控制台输出的建表语句:
XML方式
user.hbm.xml文件
<?xml version="1.0"?>
<!DOCTYPE hibernate-ma