Hibernate的注解似开发

Posted 既来之,则安之!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hibernate的注解似开发相关的知识,希望对你有一定的参考价值。

技术分享图片

挂有@的接口和一些描述元注解

 

本次开发使用的注解

 

@Id

必须,定义了映射到数据库表的主键的属性,一个实体只能有一个属性被映射为主键

 

@Table

可选,通常和@Entity配合使用,只能标注在实体的class定义处,表示实体对应的数据库表的信息 

 

@Entity

必须,name为可选,对应数据库中一的个表

 

@GeneratedValue

可选,

strategy:表示主键生成策略,有AUTOINDENTITYSEQUENCETABLE 4种,分别表示让ORM框架自动选择、根据数据库的Identity字段生成、根据数据库表的Sequence字段生成、以及根据一个额外的表生成主键。默认为AUTO  

  

generator:表示主键生成器的名称,这个属性通常和ORM框架相关。例如,Hibernate可以指定uuid等主键生成方式

默认不写采用的是本地的主键生成策咯native

 

 

@Column

可选 ,描述了数据库表中该字段的详细定义

 

@Transient

可选,表示该属性并非一个到数据库表的字段的映射,ORM框架将忽略该属性

 

@OneToMany

可选,

OneToMany指定了一对多的关系,mappedBy="room"指定了由哪一方一方来维护关联关系mappedBy指的是多的一方对1的这一方的依赖的属性,(注意:如果没有指定由谁来维护关联关系,则系统会给我们创建一张中间表)

 

@JoinColumn(name = "deptno")

通过 JoinColumn name属性指定了外键的名称 deptno (注意:如果我们不通过JoinColum来指定外键的名称,系统会给我们声明一个名称)

 

@ManyToOne(cascade = CascadeType.ALL)

ManyToOne指定了多对一的关系

CascadeType.PERSIST:级联新增

CascadeType.MERGE:级联合并

CascadeType.REFRESH:级联刷新

CascadeType.REMOVE:级联删除

CascadeType.ALL:以上四种都是

Passanger表关系定义如下:

@ManyToOne(cascade = { CascadeType.PERSIST,CascadeType.MERGE})

一对一的实例:

一个人对应着一张身份证

package cn.baby.entity;

import javax.persistence.*;
import java.io.Serializable;

/**
 * 人
 * 人与省份证一对一
 * Created by Administrator on 2018/1/3.
 */
@Entity
@Table(name = "PERSON")
public class Person implements Serializable{
    @Id
    @GeneratedValue
    private int id;
    @Column
    private String name;
    //不要初始化,初始化会使对象处于临时状态,会使保存的时候抛异常 
    @OneToOne
    //申明一个外键
    @JoinColumn(name = "pk_id")
    private Card card;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Card getCard() {
        return card;
    }

    public void setCard(Card card) {
        this.card = card;
    }
}

  

package cn.baby.entity;

import javax.persistence.*;
import java.io.Serializable;

/**
 * 省份证
 * 一对一
 * Created by Administrator on 2018/1/3.
 */
@Table(name = "CARD")
@Entity
public class Card implements Serializable{
    @Id
    @GeneratedValue
    private int id;
    //谁维护表的关系card,保存时,只需要保存card就行
    @OneToOne(mappedBy = "card",cascade = CascadeType.ALL)
    private Person person;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public Person getPerson() {
        return person;
    }

    public void setPerson(Person person) {
        this.person = person;
    }
}

 测试类

//一对一
    @Test
    public void onetoone(){
        Person person=new Person();
        Card card=new Card();
        Session session = HibernateUtil.getSession();
        Transaction transaction = session.beginTransaction();
        person.setName("威哥");
        card.setPerson(person);
        person.setCard(card);
        session.save(card);
        transaction.commit();

    }

  一对多

一个部门对应着对个员工

package cn.baby.entity;

import javax.persistence.*;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;

/**
 * 部门表
 * 一个部门下有多个员工
 * Created by Administrator on 2017/12/28.
 */
@Entity
@Table(name = "DEPT5")
public class Dept implements Serializable {
    @Id
    @GeneratedValue
    private Integer deptNo;
    @Column
    private String deptName;
    //一个部门下有多个员工 植入set集合 一对多,一定是set集合不是hashset,但是底层实现的是他
    @OneToMany(mappedBy = "dept", cascade = CascadeType.ALL)
    private Set<Emp> emps=new HashSet<Emp>();

    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;
    }

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

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

  

package cn.baby.entity;

import javax.persistence.*;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;

/**
 * 员工表
 * 一个员工对应着一个部门
 * Created by Administrator on 2017/12/28.
 */
@Table(name = "EMP5")
@Entity
public class Emp implements Serializable {
    @Id
    @GeneratedValue
    private Integer empNo;
    @Column
    private String empName;
    //一个员工对应着一个部门,植入一个部门属性
    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "deptno")
    private Dept dept;
    //mappedBy谁维护关系,mappedBy指定的是属性名称
    @ManyToMany(mappedBy = "emps",cascade = CascadeType.ALL)
    private Set<Project> projects=new HashSet<Project>();

    public Set<Project> getProjects() {
        return projects;
    }

    public void setProjects(Set<Project> projects) {
        this.projects = projects;
    }

    public Integer getEmpNo() {
        return empNo;
    }

    public void setEmpNo(Integer empNo) {
        this.empNo = empNo;
    }

    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;
    }
}

  测试类:

//一对多
    @Test
    public void onetomany(){
        Dept dept=new Dept();
        dept.setDeptName("技术部");
        Emp emp=new Emp();
        emp.setEmpName("小黄");
        Emp emp1=new Emp();
        emp1.setEmpName("小黑");
        emp.setDept(dept);
        emp1.setDept(dept);
        dept.getEmps().add(emp);
        dept.getEmps().add(emp1);
        Session session = HibernateUtil.getSession();
        Transaction transaction = session.beginTransaction();
        session.save(dept);
        transaction.commit();

    }

  多对对

一个员工可以写多个项目

一个项目可以被多个员工写

package cn.baby.entity;

import javax.persistence.*;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;

/**
 * 员工表
 * 一个员工对应着一个部门
 * Created by Administrator on 2017/12/28.
 */
@Table(name = "EMP5")
@Entity
public class Emp implements Serializable {
    @Id
    @GeneratedValue
    private Integer empNo;
    @Column
    private String empName;
    //一个员工对应着一个部门,植入一个部门属性
    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "deptno")
    private Dept dept;
    //mappedBy谁维护关系,mappedBy指定的是属性名称
    @ManyToMany(mappedBy = "emps",cascade = CascadeType.ALL)
    private Set<Project> projects=new HashSet<Project>();

    public Set<Project> getProjects() {
        return projects;
    }

    public void setProjects(Set<Project> projects) {
        this.projects = projects;
    }

    public Integer getEmpNo() {
        return empNo;
    }

    public void setEmpNo(Integer empNo) {
        this.empNo = empNo;
    }

    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;
    }
}

  

package cn.baby.entity;

import javax.persistence.*;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;

/**
 * 项目表
 * 多对多
 * Created by Administrator on 2017/12/28.
 */
@Entity
@Table(name = "PROJECT5")
public class Project implements Serializable {
    @Id
    @GeneratedValue
    private Integer proNo;
    @Column
    private String proName;
    @ManyToMany(cascade = CascadeType.ALL)
    //中间表    中间表的名称        本实体对应中间表的列                      另一个实体对应中间表的列
    @JoinTable(
            name = "proemp5",
            joinColumns = @JoinColumn(name = "proid"),
    inverseJoinColumns = @JoinColumn(name = "empid"))
    //员工集合
    private Set<Emp> emps=new HashSet<Emp>();

    public Integer getProNo() {
        return proNo;
    }

    public void setProNo(Integer proNo) {
        this.proNo = proNo;
    }

    public String getProName() {
        return proName;
    }

    public void setProName(String proName) {
        this.proName = proName;
    }

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

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

 测试类

  //duo对多
    @Test
    public void manytomany(){

        Emp emp=new Emp();
        emp.setEmpName("小黄");
        Emp emp1=new Emp();
        emp1.setEmpName("小黑");
        Project project=new Project();
        project.setProName("易买网");
        Project project1=new Project();
        project1.setProName("易买网1");
        emp.getProjects().add(project);
        emp.getProjects().add(project1);
        emp1.getProjects().add(project);
        project.getEmps().add(emp);
        project1.getEmps().add(emp);
        project.getEmps().add(emp1);
        Session session = HibernateUtil.getSession();
        Transaction transaction = session.beginTransaction();
        session.save(emp);
        session.save(emp1);
        transaction.commit();

    }

  

 

以上是关于Hibernate的注解似开发的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate注解

Hibernate注解开发(未完待续)

hibernate笔记--使用注解(annotation)方式配置单(双)向多对一的映射关系

Hibernate中注解的开发

Hibernate注解方式开发实体类

SSH(Spring+Struts2+hibernate)整合基于注解开发的详解