Hibernate 注解(总结)


一、什么是注解?

解析:来源:Hibernate提供了Hibernate Annotations扩展包,它可以替换复杂的hbm.xml文件( Annotations扩展包是hibernate-annotation-3.4.0GA.zip)

作用:使得Hibernate程序的开发大大的简化。利用注解后,可不用定义持久化类对应的*.hbm.xml,而直接以注解方式写入持久化类的实现中。

二、注解配置持久化类常用注解。

注解 含义和作用
@Entity 将 一个类声明为一个持久化类
@Id 声明了持久化类的标识属性(相当于数据表的主键)
@GeneratedValue 定义标识属性值的生成策略
@Table 为持久化类映射指定表(table)、目录(catalog)和schema的名称。默认值,持久化类名,不带包名
@UniqueConstraint 定义表的唯一约束
@Lob 表示属性将被持久化为Blob或者Clob类型
@Column 将属性映射到列
@Transient 忽略这些字段和属性,不用持久化到数据库

三.

注解配置对象关联关系

(一)@OneToOne建立持久化类之间一对一关联关系

场景一:员工对应一张身份证

Emp(员工表)

package cn.ljm.entity;

import javax.persistence.*;

/**
 * Created by win7 on 2017/2/16.
 */
@Entity
@Table(name = "Emp2")
public class Emp {

    private Integer eid;
    @Column
    private String ename;

    private Idcard idcard;
    @OneToOne
    @JoinColumn(name = "iid")
    public Idcard getIdcard() {
        return idcard;
    }

    public void setIdcard(Idcard idcard) {
        this.idcard = idcard;
    }
    @Id
    @GeneratedValue
    public Integer getEid() {
        return eid;
    }

    public void setEid(Integer eid) {
        this.eid = eid;
    }

    public String getEname() {
        return ename;
    }

    public void setEname(String ename) {
        this.ename = ename;
    }
}

Idcard类

关键代码:

//mappedBy 表示由craid所在的对象维护关联关系

**__@OneToOne(mappedBy="cardid")**__

1 package cn.ljm.entity;
 2 
 3 import javax.persistence.*;
 4 
 5 /**
 6  * Created by win7 on 2017/2/16.
 7  */
 8 @Entity
 9 @Table(name = "Idcard2")
10 public class Idcard {
11     @Id
12     @GeneratedValue
13     private Integer iid;
14     private String inum;
15     @OneToOne(mappedBy = "idcard",cascade = CascadeType.ALL)
16     private Emp emp;
17 
18     public Integer getIid() {
19         return iid;
20     }
21 
22     public void setIid(Integer iid) {
23         this.iid = iid;
24     }
25 
26     public String getInum() {
27         return inum;
28     }
29 
30     public void setInum(String inum) {
31         this.inum = inum;
32     }
33 
34     public Emp getEmp() {
35         return emp;
36     }
37 
38     public void setEmp(Emp emp) {
39         this.emp = emp;
40     }
41 }

测试类

1 import cn.ljm.entity.Emp;
 2 import cn.ljm.entity.Idcard;
 3 import org.hibernate.Session;
 4 import org.hibernate.SessionFactory;
 5 import org.hibernate.Transaction;
 6 import org.hibernate.cfg.Configuration;
 7 import org.junit.After;
 8 import org.junit.Before;
 9 import org.junit.Test;
10 
11 /**
12  * Created by win7 on 2017/2/16.
13  */
14 public class test {
15     Configuration cfg;
16     Session session;
17     Transaction tx;
18     @Before
19     public void myBefore(){
20         cfg=new Configuration().configure("hibernate2.cfg.xml");
21         SessionFactory factory=cfg.buildSessionFactory();
22         session= factory.getCurrentSession();
23         tx= session.beginTransaction();
24     }
25     @After
26     public void myAfter(){
27         tx.commit();
28     }
29     @Test
30     public void test1(){
31         Emp emp=new Emp();
32         Idcard idcard=new Idcard();
33         emp.setEname("123");
34         idcard.setInum("321");
35         idcard.setEmp(emp);
36         emp.setIdcard(idcard);
37         session.save(idcard);
38     }
39 }

二)@OneToMang and @MangToOne(建立双向关联一对多多对一)

场景一:一个部门对应多个员工;多个员工对应一个部门

Emp类

package cn.happy.entity.one;

import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

/**
 * 1.2 员工类
 * @author happy
 *
 */
@Entity
@Table
public  class Emp {
    @Id
   private Integer empId;
    @Column
   private String empName;


   @ManyToOne
   @JoinColumn(name="deptNo")
   private Dept dept;

    public Integer getEmpId() {
        return empId;
    }
    public void setEmpId(Integer empId) {
        this.empId = empId;
    }
    public String getEmpName() {
        return empName;
    }
    public void setEmpName(String empName) {
        this.empName = empName;
    }
    public Dept getDept() {
        return dept;
    }
    public void setDept(Dept dept) {
        this.dept = dept;
    }
}

Dept类

package cn.happy.entity.one;
import java.util.HashSet;
import java.util.Set;
  //jpa注解
import javassist.expr.NewArray;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;

import org.hibernate.annotations.GenericGenerator;
import org.hibernate.annotations.GenericGenerators;
import org.hibernate.annotations.LazyCollection;
import org.hibernate.annotations.LazyCollectionOption;

/**
 * 1.1 部门表    uuid  guid  全球唯一编码    自增列    序列   32位16进制数
 * 
 * @author happy
 * 
 */
   //Dept部门类可以被HIbernate进行管理
    @Entity
    @Table(name="Dept")
    public class Dept {
        @Id
        //引用生成器
        @GeneratedValue
        private Integer deptNo;

        //默认Hibernate管理
        private String deptName;

        @OneToMany(mappedBy="dept")
        @LazyCollection(LazyCollectionOption.FALSE)
        private Set<Emp> emps=new HashSet<Emp>();

        public Set<Emp> getEmps() {
            return emps;
        }

        public void setEmps(Set<Emp> emps) {
            this.emps = emps;
        }

        public Integer getDeptNo() {
            return deptNo;
        }

        public void setDeptNo(Integer deptNo) {
            this.deptNo = deptNo;
        }

        public String getDeptName() {
            return deptName;
        }

        public void setDeptName(String deptName) {
            this.deptName = deptName;
        }

    }

测试类

package cn.happy.entity.one;


import org.hibernate.Session;
import org.hibernate.Transaction;

import cn.happy.entity.Dept;
import cn.happy.entity.Emp;
import cn.happy.until.HibernateUtil;


public class mangoneonemang {

    public static void main(String[] args) {
        Session session = HibernateUtil.currentSession();
        Transaction tx = session.beginTransaction();

//        Dept dept = (Dept)session.load(Dept.class, 21);
//        
//        System.out.println(dept.getDeptName());


        Emp emp = (Emp)session.load(Emp.class, 21);

        System.out.println(emp.getEmpName());

        tx.commit();
        HibernateUtil.closeSession();


    }



}

(三)@MangToMang(建立双向关联一对多多对一)

场景一:一个员工对应多个项目;一个项目对应多个员工(多对多的关联)

Employee类

关键代码解读:

//准备的第三张表就是员工和项目的关系

**@JoinTable(
            name="Myproemp",//表的名字
            joinColumns=@JoinColumn(name="empid"),//emp员工和第三表的外键关系
            inverseJoinColumns=@JoinColumn(name="proid")//Project员工和第三表的外键关系
    )**

package entity;

import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
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;

/*
 * 员工表
 * */
@Entity
@Table(name="MyEmployee")
public class Employee {
    @Id
    @GeneratedValue
    private Integer empid;//员工编号
    private String empname;//员工名称
    //准备一个项目集合
    @ManyToMany(cascade=CascadeType.ALL)

    //准备的第三张表就是员工和项目的关系
    @JoinTable(
            name="Myproemp",//表的名字
            joinColumns=@JoinColumn(name="empid"),//emp员工和第三表的外键关系
            inverseJoinColumns=@JoinColumn(name="proid")//Project员工和第三表的外键关系
    )
    private Set<Project> pros=new HashSet<Project>();


    public Set<Project> getPros() {
        return pros;
    }
    public void setPros(Set<Project> pros) {
        this.pros = pros;
    }

    public Employee(String empname) {
        super();
        this.empname = empname;
    }
    public Employee(Integer empid, String empname) {
        this.empid = empid;
        this.empname = empname;
    }
    public Employee() {
    }
    public Integer getEmpid() {
        return empid;
    }
    public void setEmpid(Integer empid) {
        this.empid = empid;
    }
    public String getEmpname() {
        return empname;
    }
    public void setEmpname(String empname) {
        this.empname = empname;
    }

}

project类

关键代码:

//声明员工集合

**_@ManyToMany(mappedBy="pros")//将控制权交由员工**_

package entity;

import java.util.HashSet;
import java.util.Set;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.Table;

/*
 * 项目表
 * */
@Entity
@Table(name="MyProject")
public class Project {
    @Id
    @GeneratedValue
    private Integer proid;//项目编号
    private String proname;//项目名称
    //声明员工集合
//    @ManyToMany(mappedBy="pros")//将控制权交由员工
    @ManyToMany(mappedBy="pros")
    private Set<Employee> emps=new HashSet<Employee>();


    public Set<Employee> getEmps() {
        return emps;
    }
    public void setEmps(Set<Employee> emps) {
        this.emps = emps;
    }


    public Project(String proname) {
        this.proname = proname;
    }
    public Integer getProid() {
        return proid;
    }
    public void setProid(Integer proid) {
        this.proid = proid;
    }
    public String getProname() {
        return proname;
    }
    public void setProname(String proname) {
        this.proname = proname;
    }
    public Project(Integer proid, String proname) {
        this.proid = proid;
        this.proname = proname;
    }
    public Project() {
    }
}

测试类

package test;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.Session;
import org.hibernate.Transaction;

import util.HibernateUtil;
import entity.Employee;
import entity.Project;
/*
 * 多对多关系
 * */
public class Test {
    public static void main(String[] args) {
        //查询
        //select();
        //添加数据
        innesrt();
    }

    //添加数据
    public static void innesrt(){
        //获取Session 
        Session session=HibernateUtil.currentSession();

        //开启事务
        Transaction tx = session.beginTransaction();
        //构建两个项目
        Project pro1=new Project("项目一");
        Project pro2=new Project("项目二");
        //构建多个员工
        Employee emp1=new Employee("巴黎的雨季");
        Employee emp2=new Employee("盛夏的果实");

        //关系交由员工处理

        emp1.getPros().add(pro1);
        emp1.getPros().add(pro2);

        emp2.getPros().add(pro2);

        //保存
        session.save(emp1);
        session.save(emp2);


        //提交事务
        tx.commit();
        //关闭连接
        HibernateUtil.closeSession();
    }


    //查询数据
    public static void select(){
        //获取Session 
        Session session=HibernateUtil.currentSession();

        //开启事务
        Transaction tx = session.beginTransaction();
        String hql="from Project";
        List<Project> list = session.createQuery(hql).list();
        for (Project item : list) {
            System.out.println(item.getProname()+item.getProid());
            for (Employee emp : item.getEmps()) {
                System.out.println(emp.getEmpid()+emp.getEmpname());
            }
        }
        //Project pro = (Project)session.get(Project.class, 3);
        //System.out.println(pro.getProname());
        //提交事务
        tx.commit();
        //关闭连接
        HibernateUtil.closeSession();
    }



}


原文链接:https://www.cnblogs.com/wdas-87895/p/6405689.html