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建立持久化类之间一对一关联关系

场景一:一个学生对应一个身份证号(一对一关联;注意看举例子的注释)

Student类

关键代码:

   //在底层的Student数据表中植入的列名

    @JoinColumn(name="cid")//关联外键

package cn.happy.entity_sql;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.Table;

/**
 * 学生对卡    一对一关联
 * */
@Entity
@Table(name="Student")
public class Student {
    //表示属性
    @Id
    //使用默认的序列
    @GeneratedValue
    private Integer id;
    @Column(name="StuName")
    private String stuName;
    //一对一关联   保存学生的时候自动保存身份对象
    @OneToOne(cascade={CascadeType.ALL})
    //在底层的Student数据表中植入的列名
    @JoinColumn(name="cid")//关联外键
    
    private IdCard cardid;
    
    
    public Student(Integer id, String stuName, IdCard cardid) {
        super();
        this.id = id;
        this.stuName = stuName;
        this.cardid = cardid;
    }
    public Student() {
        super();
        // TODO Auto-generated constructor stub
    }
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getStuName() {
        return stuName;
    }
    public void setStuName(String stuName) {
        this.stuName = stuName;
    }
    public IdCard getCardid() {
        return cardid;
    }
    public void setCardid(IdCard cardid) {
        this.cardid = cardid;
    }
    
}

Idcard类

关键代码:

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

  @OneToOne(mappedBy="cardid")

package cn.happy.entity_sql;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToOne;
import javax.persistence.Table;

/**
 * IdCard身份证
 * */
@Entity
@Table(name="IdCard")
public class IdCard {
    @Id
    //限制长度为18位,相当于约束
    @Column(length=18)
    private String cid;
    @Column(name="cname")
    private String carName;
    //mappedBy 表示由craid所在的对象维护关联关系
    @OneToOne(mappedBy="cardid")
    private Student stu;
    
    
    public IdCard(String cid, String carName, Student stu) {
        super();
        this.cid = cid;
        this.carName = carName;
        this.stu = stu;
    }
    public IdCard() {
        super();
        // TODO Auto-generated constructor stub
    }
    public String getCid() {
        return cid;
    }
    public void setCid(String cid) {
        this.cid = cid;
    }
    public String getCarName() {
        return carName;
    }
    public void setCarName(String carName) {
        this.carName = carName;
    }
    public Student getStu() {
        return stu;
    }
    public void setStu(Student stu) {
        this.stu = stu;
    }
    
    
    
}

测试类

package cn.happy.test;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;

import cn.happy.entity_sql.IdCard;
import cn.happy.entity_sql.Student;
import cn.happy.until.HibernateUtil;

public class OneToOne_wgy {
@Test
public void GetGood(){
    Session session = HibernateUtil.currentSession();
    Transaction tx = session.beginTransaction();
    Student stu=new Student();
    stu.setStuName("聆听心跳的旋律");
    
    IdCard cid=new IdCard();
    cid.setCid("123321311111111111"); 
    stu.setCardid(cid);
    
    session.save(cid);
    session.save(stu);
    
    tx.commit();
    HibernateUtil.closeSession();
}
}

 (二)@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/yejiaojiao/p/5800077.html