实体类关系
实体类关系 | 常用注解 | 常用属性 |
一对一 | @OneToOne | cascade:与此实体一对一关联的实体的联级样式类型 cascade = CascadeType.PERSIST(级联新建) cascade = CascadeType.REMOVE(级联删除) cascade = CascadeType.REFRESH(级联刷新) cascade = CascadeType.MERGE(级联更新) cascade = CascadeType.ALL(表示选择全部四项) fetch:该实体的加载方式 fetch = FetchType.LAZY(懒加载) fetch = FetchType.EAGER(立即加载) targetEntity:默认关联的实体类型 targetEntity = className.class(className:关联的实体类) mappedBy:用于双向关联实体,在一的一方进行声明(@ManyToOne没有此属性) mappedBy="columnName"(columnName:另一方关联的字段名) |
一对多 | @OneToMany | |
多对一 | @ManyToOne | |
多对多 | @ManyToMany |
一对一
例:公民(Person)和身份证(IdentityCard)
- Person实体类
package demo.entity;
import java.io.Serializable;
import java.util.Date;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import org.springframework.format.annotation.DateTimeFormat;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
@Entity
@Table(name="person")//数据库的表名,如果数据库中没有此表,可自动生成
@JsonIgnoreProperties(value = { "hibernateLazyInitializer", "handler" })//标不需要转化为json的属性
public class Person implements Serializable {
// 表明实现序列化类的不同版本间的兼容性
private static final long serialVersionUID = 1L;
@Id //实体类的主键
@GeneratedValue(strategy = GenerationType.IDENTITY) //自动增长列
private Integer personId;
private String personName;
private String personGender;
private String personNation;
@JsonFormat(pattern="yyyy-MM-dd")
@DateTimeFormat(pattern="yyyy-MM-dd") //格式化日期类型
private Date personBirth;
private String personAddress;
@JsonIgnore // 标记在属性或者方法上,返回的json数据即不包含该属性
@OneToOne(optional = false, mappedBy = "person", cascade = CascadeType.ALL, fetch = FetchType.EAGER) //该表不建外键、optional属性:是否可以为空(默认值为:true)
private IdentityCard identityCard;
//----------------------------- 此处省略了 无参构造 和 有参构造 ------------------------
//----------------------------- 此处省略了 Getter 和 Setter 方法 ------------------------
//----------------------------- 此处省略了重写的 toString 方法 ------------------------
}
- IdentityCard实体类
package demo.entity;
import java.io.Serializable;
import java.util.Date;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import org.springframework.format.annotation.DateTimeFormat;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
@Entity
@Table(name="identity_card")//数据库的表名,如果数据库中没有此表,可自动生成
@JsonIgnoreProperties(value = { "hibernateLazyInitializer", "handler" })//标不需要转化为json的属性
public class IdentityCard implements Serializable {
// 表明实现序列化类的不同版本间的兼容性
private static final long serialVersionUID = 1L;
@Id //实体类的主键
private String cardId;
private String cardName;
private String cardGender;
private String cardNation;
@JsonFormat(pattern="yyyy-MM-dd")
@DateTimeFormat(pattern="yyyy-MM-dd") //格式化日期类型
private Date cardBirth;
private String cardAddress;
@JsonIgnore // 标记在属性或者方法上,返回的json数据即不包含该属性
@OneToOne(cascade=CascadeType.ALL) // 一对一
@JoinColumn(name="card_person_id",unique=true) // name:此表的外键关联字段
private Person person;
//----------------------------- 此处省略了 无参构造 和 有参构造 ------------------------
//----------------------------- 此处省略了 Getter 和 Setter 方法 ------------------------
//----------------------------- 此处省略了重写的 toString 方法 ------------------------
}
一对多
说明:前者(一)维护关联关系
例:学生(Student)和学校(School)之间的关系
- Student实体类
import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
@Entity
@Table(name = "student") // 对应数据库的表名,没有表时自动创建该表
@JsonIgnoreProperties(value = { "hibernateLazyInitializer", "handler" }) //标不需要转化为json的属性
public class Student implements Serializable{
// 表明实现序列化类的不同版本间的兼容性
private static final long serialVersionUID = 1L;
@Id // 实体类的主键
@GeneratedValue(strategy = GenerationType.IDENTITY) // 自动增长列
private Integer studentId;
private String studentName;
//----------------------------- 此处省略了 无参构造 和 有参构造 ------------------------
//----------------------------- 此处省略了 Getter 和 Setter 方法 ------------------------
//----------------------------- 此处省略了重写的 toString 方法 ------------------------
}
- School实体类
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
@Entity
@Table(name = "school") // 对应数据库的表名,没有表时自动创建该表
@JsonIgnoreProperties(value = { "hibernateLazyInitializer", "handler" }) //标不需要转化为json的属性
public class School implements Serializable {
// 表明实现序列化类的不同版本间的兼容性
private static final long serialVersionUID = 1L;
@Id // 实体类的主键
@GeneratedValue(strategy = GenerationType.IDENTITY) // 自动增长列
private Integer schoolId;
private String schoolName;
@OneToMany // 一对多
// 设置外键 name:关联字段名(无字段时自动生成)、referencedColumnName:主键字段名、,insertable = false, updatable = false:设置该字段只读
@JoinColumn(name="sid",referencedColumnName="schoolId")
private List<Student> student;
//----------------------------- 此处省略了 无参构造 和 有参构造 ------------------------
//----------------------------- 此处省略了 Getter 和 Setter 方法 ------------------------
//----------------------------- 此处省略了重写的 toString 方法 ------------------------
}
多对一
说明:前者(多)维护关联关系
例:学生(Student)和学校(School)之间的关系
- Student实体类
import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
@Entity
@Table(name = "student") // 对应数据库的表名,没有表时自动创建该表
@JsonIgnoreProperties(value = { "hibernateLazyInitializer", "handler" }) //标不需要转化为json的属性
public class Student implements Serializable{
// 表明实现序列化类的不同版本间的兼容性
private static final long serialVersionUID = 1L;
@Id // 实体类的主键
@GeneratedValue(strategy = GenerationType.IDENTITY) // 自动增长列
private Integer studentId;
private String studentName;
@ManyToOne // 多对一
// 设置外键 name:关联字段名(无字段时自动生成)、referencedColumnName:主键字段名、,insertable = false, updatable = false:设置该字段只读
@JoinColumn(name="sid",referencedColumnName="schoolId")
private School school;
//----------------------------- 此处省略了 无参构造 和 有参构造 ------------------------
//----------------------------- 此处省略了 Getter 和 Setter 方法 ------------------------
//----------------------------- 此处省略了重写的 toString 方法 ------------------------
}
- School实体类
import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
@Entity
@Table(name = "school") // 对应数据库的表名,没有表时自动创建该表
@JsonIgnoreProperties(value = { "hibernateLazyInitializer", "handler" }) //标不需要转化为json的属性
public class School implements Serializable {
// 表明实现序列化类的不同版本间的兼容性
private static final long serialVersionUID = 1L;
@Id // 实体类的主键
@GeneratedValue(strategy = GenerationType.IDENTITY) // 自动增长列
private Integer schoolId;
private String schoolName;
//----------------------------- 此处省略了 无参构造 和 有参构造 ------------------------
//----------------------------- 此处省略了 Getter 和 Setter 方法 ------------------------
//----------------------------- 此处省略了重写的 toString 方法 ------------------------
}
双向 一对多 、多对一
说明:一对多 、多对一两者相结合
例:学生(Student)和学校(School)之间的关系
- Student实体类
import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
@Entity
@Table(name = "student") // 对应数据库的表名,没有表时自动创建该表
@JsonIgnoreProperties(value = { "hibernateLazyInitializer", "handler" }) //标不需要转化为json的属性
public class Student implements Serializable{
// 表明实现序列化类的不同版本间的兼容性
private static final long serialVersionUID = 1L;
@Id // 实体类的主键
@GeneratedValue(strategy = GenerationType.IDENTITY) // 自动增长列
private Integer studentId;
private String studentName;
@JsonIgnore // 标记在属性或者方法上,返回的json数据即不包含该属性
@ManyToOne(targetEntity = School.class)
@JoinColumn(name="sid") // 设置外键
private School school;
//----------------------------- 此处省略了 无参构造 和 有参构造 ------------------------
//----------------------------- 此处省略了 Getter 和 Setter 方法 ------------------------
//----------------------------- 此处省略了重写的 toString 方法 ------------------------
}
- School实体类
import java.io.Serializable;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
@Entity
@Table(name = "school") // 对应数据库的表名,没有表时自动创建该表
@JsonIgnoreProperties(value = { "hibernateLazyInitializer", "handler" }) //标不需要转化为json的属性
public class School implements Serializable {
// 表明实现序列化类的不同版本间的兼容性
private static final long serialVersionUID = 1L;
@Id // 实体类的主键
@GeneratedValue(strategy = GenerationType.IDENTITY) // 自动增长列
private Integer schoolId;
private String schoolName;
@JsonIgnore // 标记在属性或者方法上,返回的json数据即不包含该属性
// mappedBy="school" school对应Student实体类中"private School school;"的属性名
@OneToMany(mappedBy="school",fetch=FetchType.EAGER,cascade=CascadeType.ALL)
private List<Student> student;
//----------------------------- 此处省略了 无参构造 和 有参构造 ------------------------
//----------------------------- 此处省略了 Getter 和 Setter 方法 ------------------------
//----------------------------- 此处省略了重写的 toString 方法 ------------------------
}
双向多对多
例:用户(User)和角色(Role)之间的关系
- User实体类
import java.io.Serializable;
import java.util.Set;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;
import org.hibernate.annotations.NotFound;
import org.hibernate.annotations.NotFoundAction;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
@Entity
@Table(name = "user") // 对应数据库的表名,没有表时自动创建该表
@JsonIgnoreProperties(value = { "hibernateLazyInitializer", "handler" })//标不需要转化为json的属性
public class User implements Serializable{
// 表明实现序列化类的不同版本间的兼容性
private static final long serialVersionUID = 1L;
@Id //实体类的主键
@GeneratedValue(strategy = GenerationType.IDENTITY) // 自动增长列
private Integer uid;
private String uname;
private String upassword;
@JsonIgnore // 标记在属性或者方法上,返回的json数据即不包含该属性
@ManyToMany(fetch = FetchType.EAGER) // @ManyToMany:多对多、fetch = FetchType.EAGER:立即加载
@Cascade(value={CascadeType.SAVE_UPDATE}) // 级联关系
@JoinTable(name="user_role", // 指定第三张中间表名称,此表不需创建实体类
joinColumns={@JoinColumn(name="user_role_uid")}, // 本表主键 uid 与第三张中间表 user_role 的外键 user_role_uid 对应
inverseJoinColumns={@JoinColumn(name="user_role_rid")}) // 多对多关系另一张表与第三张中间表表的外键的对应关系
// NotFoundAction.IGNORE找不到引用的外键数据时忽略、NotFoundAction.EXCEPTION:找不到元素时引发异常(默认和建议)
@NotFound(action = NotFoundAction.IGNORE)
private Set<Role> role;
//----------------------------- 此处省略了 无参构造 和 有参构造 ------------------------
//----------------------------- 此处省略了 Getter 和 Setter 方法 ------------------------
//----------------------------- 此处省略了重写的 toString 方法 ------------------------
}
- Role实体类
import java.io.Serializable;
import java.util.Set;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;
import org.hibernate.annotations.NotFound;
import org.hibernate.annotations.NotFoundAction;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
@Entity
@Table(name = "role") // 对应数据库的表名,没有表时自动创建该表
@JsonIgnoreProperties(value = { "hibernateLazyInitializer", "handler" }) // 标不需要转化为json的属性
public class Role implements Serializable {
// 表明实现序列化类的不同版本间的兼容性
private static final long serialVersionUID = 1L;
@Id // 实体类的主键
@GeneratedValue(strategy = GenerationType.IDENTITY) // 自动增长列
private Integer rid;
private String rname;
@JsonIgnore // 标记在属性或者方法上,返回的json数据即不包含该属性
@ManyToMany(fetch=FetchType.EAGER) // @ManyToMany:多对多关系、fetch = FetchType.EAGER:立即加载
@Cascade(value={CascadeType.SAVE_UPDATE}) // 级联关系
@JoinTable(name="user_role", // 指定第三张中间表名称,此表不需创建实体类
joinColumns={@JoinColumn(name="user_role_rid")}, // 本表主键 rid 与第三张中间表 user_role 的外键 user_role_rid 对应.本表与中间表的外键对应关系
inverseJoinColumns={@JoinColumn(name="user_role_uid")}) // 多对多关系另一张表与第三张中间表表的外键的对应关系
// NotFoundAction.IGNORE找不到引用的外键数据时忽略、NotFoundAction.EXCEPTION:找不到元素时引发异常(默认和建议)
@NotFound(action = NotFoundAction.IGNORE)
private Set<User> user; // 存放User列表
//----------------------------- 此处省略了 无参构造 和 有参构造 ------------------------
//----------------------------- 此处省略了 Getter 和 Setter 方法 ------------------------
//----------------------------- 此处省略了重写的 toString 方法 ------------------------
}