Hibernate 支持 JPA 注解的 jar 包
JPA 全称: Java Persistence API
JPA 和 Hibernate 之间的关系, 可以简单的理解为 JPA 是标准接口, Hibernate 是实现.
使用注解的形式进行配置可以代替实体类的 *.hbm.xml 的映射配置文件, 但仍需在 hibernate.cfg.xml 配置文件中进行实体类的注册
实例: class 班级, student 学生, project 学科.
配置一对多与多对一, 多对多.
学生实体类 Student.java
- package com.pojo;
- import java.util.Date;
- import java.util.Set;
- import javax.persistence.CascadeType;
- import javax.persistence.Column;
- import javax.persistence.Entity;
- import javax.persistence.FetchType;
- import javax.persistence.GeneratedValue;
- import javax.persistence.Id;
- import javax.persistence.JoinColumn;
- import javax.persistence.JoinTable;
- import javax.persistence.ManyToMany;
- import javax.persistence.ManyToOne;
- import javax.persistence.Table;
- import org.hibernate.annotations.GenericGenerator;
- @Entity
- @Table(name="student_info",schema="C##java06")
- public class Student {
- @Id// 表明这个字段就是主键
- @GeneratedValue(generator="incre")
- @GenericGenerator(name="incre",strategy="increment")
- @Column(name="student_id")
- int studentId;
- @Column(name="student_name")
- String studentName;
- @Column(name="student_Sex")
- String studentSex;
- @Column(name="student_age")
- int studentAge;
- // @Column(name="class_Id")
- // int classId;
- @ManyToOne(cascade=CascadeType.REFRESH,fetch=FetchType.EAGER)
- @JoinColumn(name="class_id")
- ClassInfo classinfo;
- @Column(name="birthday")
- Date birthday;
- @ManyToMany(fetch=FetchType.EAGER)
- @JoinTable(name="stu_project")
- Set<ProjectInfo> projects;
- public int getStudentId() {
- return studentId;
- }
- public void setStudentId(int studentId) {
- this.studentId = studentId;
- }
- public String getStudentName() {
- return studentName;
- }
- public void setStudentName(String studentName) {
- this.studentName = studentName;
- }
- public String getStudentSex() {
- return studentSex;
- }
- public void setStudentSex(String studentSex) {
- this.studentSex = studentSex;
- }
- public int getStudentAge() {
- return studentAge;
- }
- public void setStudentAge(int studentAge) {
- this.studentAge = studentAge;
- }
- // public int getClassId() {
- // return classId;
- // }
- // public void setClassId(int classId) {
- // this.classId = classId;
- // }
- public Date getBirthday() {
- return birthday;
- }
- public void setBirthday(Date birthday) {
- this.birthday = birthday;
- }
- public ClassInfo getClassinfo() {
- return classinfo;
- }
- public void setClassinfo(ClassInfo classinfo) {
- this.classinfo = classinfo;
- }
- public Set<ProjectInfo> getProjects() {
- return projects;
- }
- public void setProjects(Set<ProjectInfo> projects) {
- this.projects = projects;
- }
- public Student() {
- }
- public Student(int studentId, String studentName, String studentSex, int studentAge, ClassInfo classinfo, Date birthday) {
- this.studentId = studentId;
- this.studentName = studentName;
- this.studentSex = studentSex;
- this.studentAge = studentAge;
- // this.classId = classId;
- this.classinfo = classinfo;
- this.birthday = birthday;
- }
- }
班级实体类 ClassInfo.java
- package com.pojo;
- import java.util.Date;
- import java.util.Set;
- import javax.persistence.CascadeType;
- import javax.persistence.Column;
- import javax.persistence.Entity;
- import javax.persistence.FetchType;
- import javax.persistence.GeneratedValue;
- import javax.persistence.Id;
- import javax.persistence.OneToMany;
- import javax.persistence.Table;
- import org.hibernate.annotations.GenericGenerator;
- @Entity
- @Table(name="class_info",schema="JAVA")
- public class ClassInfo {
- @Id// 表明这个字段就是主键
- @GeneratedValue(generator="incre")
- @GenericGenerator(name="incre",strategy="increment")
- @Column(name="class_id")
- // @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="CUST_SEQ")// 使用序列的方式维护主键
- int classId;
- @Column(name="class_name")
- String className;
- @Column(name="create_time")
- Date createTime;
- @Column(name="status")
- String status;
- @OneToMany(mappedBy="classinfo",cascade=CascadeType.ALL ,fetch=FetchType.EAGER)
- Set<Student> stus;
- public ClassInfo() {
- }
- public ClassInfo(int classId, String className, Date createTime, String status) {
- this.classId = classId;
- this.className = className;
- this.createTime = createTime;
- this.status = status;
- }
- public int getClassId() {
- return classId;
- }
- public void setClassId(int classId) {
- this.classId = classId;
- }
- public String getClassName() {
- return className;
- }
- public void setClassName(String className) {
- this.className = className;
- }
- public Date getCreateTime() {
- return createTime;
- }
- public void setCreateTime(Date createTime) {
- this.createTime = createTime;
- }
- public String getStatus() {
- return status;
- }
- public void setStatus(String status) {
- this.status = status;
- }
- public Set<Student> getStus() {
- return stus;
- }
- public void setStus(Set<Student> stus) {
- this.stus = stus;
- }
- }
科目实体类 ProjectInfo.java
- package com.pojo;
- import java.util.Set;
- import javax.persistence.Column;
- import javax.persistence.Entity;
- import javax.persistence.GeneratedValue;
- import javax.persistence.Id;
- import javax.persistence.ManyToMany;
- import javax.persistence.Table;
- import org.hibernate.annotations.GenericGenerator;
- @Entity
- @Table(name="project_info",schema="JAVA")
- public class ProjectInfo {
- @Id// 表明这个字段就是主键
- @GeneratedValue(generator="incre")
- @GenericGenerator(name="incre",strategy="increment")
- @Column(name="project_id")
- int projectid;
- @Column(name="project_name")
- String projectname;
- @ManyToMany(mappedBy="projects")
- Set<Student> stus;
- public int getProjectid() {
- return projectid;
- }
- public void setProjectid(int projectid) {
- this.projectid = projectid;
- }
- public String getProjectname() {
- return projectname;
- }
- public void setProjectname(String projectname) {
- this.projectname = projectname;
- }
- }
配置文件 hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE hibernate-configuration PUBLIC
- "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
- "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
- <hibernate-configuration>
- <session-factory>
- <!-- 数据库方言 -->
- <property name="dialect">org.hibernate.dialect.Oracle10gDialect</property>
- <property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>
- <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
- <property name="connection.username">C##java06</property>
- <property name="connection.password">java123</property>
- <property name="show_sql">true</property>
- <property name="format_sql">true</property>
- <property name="hibernate.hbm2ddl.auto">update</property>
- <!-- 所有的实体类映射文件要在此处全部注册 -->
- <!-- <mapping resource="com/pojo/Student.hbm.xml"/> -->
- <!-- 用注解的方式写 pojo -->
- <mapping class="com.pojo.ClassInfo"/>
- <mapping class="com.pojo.Student"/>
- <mapping class="com.pojo.ProjectInfo"/>
- </session-factory>
- </hibernate-configuration>
测试代码
TestRelotion.java
- package com.dao;
- import java.util.Date;
- import java.util.HashSet;
- import java.util.List;
- import com.pojo.ClassInfo;
- import com.pojo.ProjectInfo;
- import com.pojo.Student;
- public class TestRelotion {
- public static void main(String[] args) {
- IStudentDAO stuDAO = new StudentDAO();
- // List<Student> list = stuDAO.queryObjectByHql("from Student");
- // for (Student stu : list) {
- // System.out.println(stu.getStudentName()+", 班级是:"+stu.getClassinfo().getClassName()+"开班时间:"+stu.getClassinfo().getCreateTime());
- // }
- //
- IClassInfoDAO cdao = new ClassInfoDAO();
- // List<ClassInfo> cs = cdao.queryObjectBySql("select * from Class_Info a where a.class_Id=1",ClassInfo.class);
- // ClassInfo c= cs.get(0);
- // System.out.println(c.getClassName());
- // for (Student stu : c.getStus()) {
- // System.out.println(stu.getStudentName()+"\t"+stu.getBirthday());
- // }
- // 新增学员
- // ClassInfo c = new ClassInfo(2, null, null, null);
- // Student stu = new Student(0,"测试新增","1",20,c,new Date());
- // stuDAO.saveObject(stu);
- // 删除学员
- // Student stu = new Student();
- // stu.setStudentId(13);
- // stuDAO.delObject(stu);
- // 修改学员
- // List<Student> stus = stuDAO.queryObjectByHql("from Student a where a.studentId=1");
- // Student stu = stus.get(0);
- // stu.setStudentName("谢娜");
- // stu.setClassinfo(new ClassInfo(1,null,null,null));
- // stuDAO.updateObject(stu);
- // 删除班级
- // ClassInfo c = new ClassInfo(3, null, null, null);
- // cdao.delObject(c);
- // 给学员选课
- // 给学员新增选课
- // 给学员删除选课
- // 查询学员选了哪些课
- // 查询课程被哪些学员选中
- List<Student> stus = stuDAO.queryObjectByHql("from Student a where a.studentId=1");
- Student stu = stus.get(0);
- //stu.setProjects(projects);
- IProjectInfoDAO projectDAO = new ProjectInfoDAO();
- // List<ProjectInfo> plist = projectDAO.queryObjectByHql("from ProjectInfo");
- // stu.setProjects(new HashSet(plist));
- // stuDAO.updateObject(stu);
- // for (ProjectInfo p : stu.getProjects()) {
- // System.out.println(p.getProjectname());
- // }
- }
- }
附:
常用 JPA 注解
常用:
@Entity: @Table(name="表名",schema="数据库名"): 表明这是一个实体类. 一般用于 jpa 这两个注解一般一块使用, 但是如果表名和实体类名相同的话, @Table 可以省略
@Id: 表示该属性为主键.
@Column: 如果字段名与列名相同, 则可以省略.
@GeneratedValue:JPA 通用策略生成器
(strategy = GenerationType.SEQUENCE,generator = "repair_seq"): 表示主键生成策略是 sequence(可以为 Auto,IDENTITY,native 等, Auto 表示可在多个数据库间切换), 指定 sequence 的名字是 repair_seq.
TABLE: 使用一个特定的数据库表格来保存主键.
SEQUENCE: 根据底层数据库的序列来生成主键, 条件是数据库支持序列.
IDENTITY: 主键由数据库自动生成 (主要是自动增长型)
AUTO: 主键由程序控制.
@GenericGenerator:hibernate 主键策略生成器
@GenericGenerator 注解配合 @GeneratedValue 一起使用, @GeneratedValue 注解中的 "generator" 属性要与 @GenericGenerator 注解中 name 属性一致, strategy 属性表示 hibernate 的主键生成策略
@OneToOne, @OneToMany, @ManyToOne: 对应 hibernate 配置文件中的一对一, 一对多, 多对一, 有主从关系.
eg: @OneToMany(mappedBy="classinfo",cascade=CascadeType.ALL ,fetch=FetchType.EAGER)
fetch 取值:
FetchType.EAGER 表示主类被加载时加载,
FetchType.LAZY 后者表示被访问时才会加载.
cascade 取值:
- CascadeType.PERSIST(级联新建),
- CascadeType.REMOVE(级联删除),
- CascadeType.REFRESH(级联刷新),
- CascadeType.MERGE(级联更新),
- CascadeType.ALL(选择全部).
@JoinColumn(name="loginId"): 一对一: 本表中指向另一个表的外键. 一对多: 另一个表指向本表的外键.
其他:
@SequenceGeneretor(name = "repair_seq", sequenceName = "seq_repair", allocationSize = 1):name 为 sequence 的名称, 以便使用, sequenceName 为数据库的 sequence 名称, 两个名称可以一致.
@Transient: 表示该属性并非一个到数据库表的字段的映射, ORM 框架将忽略该属性.
如果一个属性并非数据库表的字段映射, 就务必将其标示为 @Transient, 否则, ORM 框架默认其注解为 @Basic.
@Basic(fetch=FetchType.LAZY): 标记可以指定实体属性的加载方式
@JsonIgnore: 作用是 JSON 序列化时将 Java bean 中的一些属性忽略掉, 序列化和反序列化都受影响.
@MappedSuperClass: 用在确定是父类的 entity 上. 父类的属性子类可以继承.
@NoRepositoryBean: 一般用作父类的 repository, 有这个注解, spring 不会去实例化该 repository.
来源: http://www.bubuko.com/infodetail-3040520.html