关于使用hibernate注解总结

Posted zwk2018

tags:

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

首先,我们先了解一下什么是hibernate注解:

  Hibernate提供了Hibernate Annotations扩展包,它可以替代复杂的*hbm.xml,从而使得hibernate程序的开发大大简化。

  带注解的持久类也是普通POJO,它们只是具备了持久性注解的普通POJO

  事实上,使用注解时我们可以保持字段的持久性(注解写在成员变量上) 也可以保持属性(注解写在getter方法上)的持久性。

 

接下来,我们看一下hibernate常用的注解有哪些以及如何使用

@Entity——注释声明该类为持久类。将一个javabean类声明为一个实体的数据库表映射类,最好实现序列化

      此时,默认情况下,所有的类属性都为映射到数据表的持久性字段.若在类中,添加另外属性,而非映射来数据库的, 要用下面的Transient来注解.

 

@Table(name="student",schema="mytest")——持久性映射的表(name=“student”) @Table是类一级的注解

@Table定义在@Entity下,为实体bean映射表,默认为实体类名,不用带包名

 

@Id——注释可以表中的主键

@GeneratedValue(strategy=GenerationType.IDENTITY)——定义自动增长的主键的生成策略.

Hibernate 能够出色地自动生成主键。Hibernate/EBJ 3 注释也可以为主键的自动生成提供丰富的支持,允许实现各种策略。
其生成规则由@GeneratedValue设定的.

JPA提供的四种标准用法为TABLE,SEQUENCE,IDENTITY,AUTO.
TABLE:使用一个特定的数据库表格来保存主键。
SEQUENCE:根据底层数据库的序列来生成主键,条件是数据库支持序列。
IDENTITY:主键由数据库自动生成(主要是自动增长型)
AUTO:主键由程序控制。

在指定主键时,如果不指定主键生成策略,默认为AUTO。

@Id

 

相当于

 

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
 
@Transient——将忽略这些字段和属性,不用持久化到数据库中,适用于在持久化类中某些属性不属于映射到的数据表,而是其他的
 
@Enumerated——声明枚举
 
@Version——声明对乐观锁的支持
 
@OneToOne——可以建立实体bean之间的一对一的关联

@OneToMany——可以建立实体bean之间的一对多的关联

@ManyToOne——可以建立实体bean之间的多对一的关联

@ManyToMany——可以建立实体bean之间的多对多的关联

@Formula——一个SQL表达式,这种属性是只读的,不在数据库生成属性(可以使用sum、average、max等)

@OrderBy——Many端某个字段排序(List)
 
下面贴上自己写的一个测试实体类代码
package com.zwk;

import javax.persistence.*;

@Entity
@Table(name = "student", schema = "mytest")
public class StudentEntity {
    private int sid;
    private String sname;
    private String sex;
    private GradeEntity grade;
    public  StudentEntity(){

    }
    //gid是外键  与grade表的主键关联,表示可以多个学生属于一个班级
    @ManyToOne              //指定多对一关系映射
    @JoinColumn(name="gid")   //指定对应的列
    public GradeEntity getGrade() {
        return grade;
    }

    public void setGrade(GradeEntity grade) {
        this.grade = grade;
    }

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "sid")
    public int getSid() {
        return sid;
    }

    public void setSid(int sid) {
        this.sid = sid;
    }

    @Basic
    @Column(name = "sname")
    public String getSname() {
        return sname;
    }

    public void setSname(String sname) {
        this.sname = sname;
    }

    @Basic
    @Column(name = "sex")
    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        StudentEntity that = (StudentEntity) o;

        if (sid != that.sid) return false;
        if (sname != null ? !sname.equals(that.sname) : that.sname != null) return false;
        if (sex != null ? !sex.equals(that.sex) : that.sex != null) return false;

        return true;
    }

    @Override
    public int hashCode() {
        int result = sid;
        result = 31 * result + (sname != null ? sname.hashCode() : 0);
        result = 31 * result + (sex != null ? sex.hashCode() : 0);
        return result;
    }
}
package com.zwk;

import org.hibernate.annotations.Cascade;

import javax.persistence.*;
import java.util.HashSet;
import java.util.Set;
@Entity
@Table(name = "grade", schema = "mytest")
public class GradeEntity {
    private int gid;
    private String gname;
    private String gdesc;
    private Set<StudentEntity> students=new HashSet<StudentEntity>();
    public GradeEntity(){

    }
    @OneToMany//指定一对多关系
    @Cascade(value = {org.hibernate.annotations.CascadeType.SAVE_UPDATE})//设置级联关系
    @JoinColumn(name="gid")
    public Set<StudentEntity> getStudents() {
        return students;
    }

    public void setStudents(Set<StudentEntity> students) {
        this.students = students;
    }

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "gid")

    public int getGid() {
        return gid;
    }

    public void setGid(int gid) {
        this.gid = gid;
    }

    @Basic
    @Column(name = "gname")
    public String getGname() {
        return gname;
    }

    public void setGname(String gname) {
        this.gname = gname;
    }

    @Basic
    @Column(name = "gdesc")
    public String getGdesc() {
        return gdesc;
    }

    public void setGdesc(String gdesc) {
        this.gdesc = gdesc;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        GradeEntity that = (GradeEntity) o;

        if (gid != that.gid) return false;
        if (gname != null ? !gname.equals(that.gname) : that.gname != null) return false;
        if (gdesc != null ? !gdesc.equals(that.gdesc) : that.gdesc != null) return false;

        return true;
    }

    @Override
    public int hashCode() {
        int result = gid;
        result = 31 * result + (gname != null ? gname.hashCode() : 0);
        result = 31 * result + (gdesc != null ? gdesc.hashCode() : 0);
        return result;
    }
}

 

 















以上是关于关于使用hibernate注解总结的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate注解常见错误

hibernate关于一对一注解配置

Hibernate注解方法使用总结

关于hibernate注解的问题

Hibernate 关于实体映射常用注解

08-hibernate注解-总结