为了账号安全,请及时绑定邮箱和手机立即绑定

hibernate基本注解(全)

标签:
Java

对hibernate的注解都是一知半解的,这次系统记录注解,便于查找

类级别注解
  • @Entity映射实体类
    @Entity(name="tableName")

    name:可选,对应数据库中的一个表。若表名与实体类名相同,则可以省略
    注意:使用@Entity时必须指定实体类的主键属性


  • @Table
    @Table(name="",catalog="",schema="")
    @Entity配合使用,只能标注在实体的class定义处,表示实体对应的数据库表的信息。
    name:可选,映射表的名称,默认表名和实体名称一致,只有在不一致的情况下才需要指定表名。
    catalog 可选,表示Catalog名称,默认为Catalog("")
    schema - 可选,表示Schema名称,默认为Schema("").
    各种数据库系统对Catalog和Schema的支持和实现方式千差万别

  • Embeddable
    @Embeddable表示一个非Entity类可以嵌入到另一个Entity类中作为属性而存在。例如:employee类中有个department属性,而departtent是个类
@Entity
public class Employee{
    private Department dp;
}
@Embeddable
public class Department{
}
属性级别注解

添加到属性字段上面或者get访问器上必须统一

  • @Id

    必须,定义了映射到数据库表的主键的属性,一个实体类可以有一个或者多个属性被映射为主键,
    可置于主键属性或者getXxx()前,注意:如果有多个属性定义为主键属性,该实体类必须实现serializable接口

  • @SequenceGenerator
  • @GeneratedValue

    @GeneratedValue(strategy=GenerationType,generator=""):可选,用于定义主键生成策略

    strategy表示主键生成策略,取值有:
    GenerationType.AUTO:根据底层数据库自动选择(默认)
    GenerationType.INDENTITY:根据数据库的Identity字段生成
    GenerationType.SEQUENCE:使用Sequence来决定主键的取值
    GenerationType.TABLE:使用指定表来决定主键取值,结合@TableGenerator使用

  • @Column

    @Column-可将属性映射到列,使用该注解来覆盖默认值,@Column描述了数据库表中该字段的详细定义,这对于根据JPA注解生成数据库表结构的工具非常有作用。
    常用属性:
    name:可选,表示数据库表中该字段的名称,默认情形属性名称一致
    nullable: 可选,表示该字段是否允许为null,默认为true
    unique: 可选,表示该字段是否为唯一标识,默认为false
    length: 可选,表示该字段的大小,仅对String类型的字段有效,默认值225,主键不能使用默认值
    insertable: 可选,表示在ORM框架执行插入操作时,该字段是否应出现INSERTRT语句中,默认为true updateable: 可选,表示在ORM框架执行更新操作时,该字段是否应该出现在UPDATE语句中,默认为true。对于已经创建
    就不可以更改的字段,该属性非常有用

  • @Enbedded

    @Embedded是注释属性的,表示该属性的类是嵌入类。
    注意:同时嵌入类也必须标注@Embeddable注解

  • @EnbeddedId

    @EmbeddedId使用嵌入式主键类实现复合主键
    注意:嵌入式主键类必须实现Serializable接口、必须有默认的public无参数的构造方法、必须覆盖equals和hashCode方法

  • @Lob

    @Lob注解表示属性将被持久化为Blob或者Clob类型, 具体取决于属性的类型

  • @Version

    @Version注解来发现数据库记录的并发操作。当JPA运行时检测到一个并发操作也在试图更改同一条记录。它会抛出一个尝试提交的事务异常。

  • @Basic

    但对于一些特殊的属性,比如长文本型text、字节流型blob型的数据,在加载Entity时,这些属性对应的数据量比较大,有时创建实体时如果也加载的话,可能严重造成资源的占用。要想解决这些问题,此时就需要设置实体属性的加载方式为惰性加载(LAZY)。

    @javax.persistence.Basic(fetch=FetchType.LAZY,optional=true)
    fetch:抓取策略,延时加载与立即加载

  • @transient

    表示该属性并非一个到数据库表的字段映射,ORM 框架将忽略该属性,ORM 默认为@Basic

关联级别注解
  • 一对一单向关外键

    public class Student{
    private String id;
    private IdCard idCard;
    ...
    @OneToOne(cascade=CascadeType.ALL) // 级联关系(数据同步,删除一边,另一边也删除等)
    @JoinColumn(name="cid",unique=true) // 外键名称
    public IdCard setIdCard(){
        this.idCard = idCard;
    }
    } 
    }
    public class IdCard{
    private String iid;
    ...
    }
  • 一对一双向外键

    注意 :双向关联只能交给一方去控制,不可能双方都保存关联关系

public class Student{
    private String id;
    private IdCard card;
    ...
    @OneToOne(cascade=CascadeType.ALL) // 级联关系(数据同步,删除一边,另一边也删除等)
    @JoinColumn(name="cid",unique=true) // 外键名称
    public IdCard setCard(){
        this.idCard = idCard;
    }
    } 
}
public class IdCard{
    private String iid;
    private Student student;
    @OneToOne(mappedBy("card")) //card是指Student.card
    public Student setStudent(){
    }
    ...
}
  • 多对一(一对多)单向外键:多方持有一方的引用
public class Student{
    private String id;
    private ClassRoom classRoom;
    ...
    @ManyToOne(cascade={CascadeType.ALL},fetch=FetchType.EAGER) //级联关系,抓取规则
    // @JoinColumn中的name为当前类的属性名,(多对一单向,有多方维护)所以,name为student中的cid,而ReferenceColumnName为引用表的列(多对一单向,所以为一方的引用列)即ClassRoom中的主键列
    @JoinColumn(name="cid",referencedColumnName="CID")  
    public CLassRoom setClassRoom(ClassRoom classRoom){
        this.classRoom = classRoom;
    } 
}
public class ClassRoom{
    private String cid;
    ...
}
  • 多对一(一对多)双向外键:多方持有一方的引用,一方持有多方的集合

student不变

public class Student{
    private String id;
    private ClassRoom classRoom;
    ...
    @ManyToOne(cascade={CascadeType.ALL},fetch=FetchType.EAGER) //级联关系,抓取规则
    // name为ClassRoom.cid
    @JoinColumn(name="cid") 
    public CLassRoom setClassRoom(ClassRoom classRoom){
        this.classRoom = classRoom;
    } 
    } 
}
// ClassRoom添加
public class ClassRoom{
    private String cid;
    private Map<String,Student> student;

    @OneToMany(cascade={CascadeType.ALL},fetch=FetchType.LAZY) //级联关系,抓取规则
    @JoinColumn(name="cid") 
    public Map<String,Student> getStudent(){
    }
    ...
}
  • 多对多单向关联

    Teacher类中

@ManyToMany
@JoinTable(name="student_teacher",//中间表名
joinColumns=@JoinColumn(name="teacher_id"),//这个类在表中的id
inverseJoinColumns=@JoinColumn(name="student_id")//反转的类在联合表中的id
)
public Set<Student> getStudentSet() {
return studentSet;
}
  • 多对多双向关联

    Teacher类

    @ManyToMany
    @JoinTable(name="student_teacher",
    joinColumns=@JoinColumn(name="teacher_id"),//这个类在表中的id
    inverseJoinColumns=@JoinColumn(name="student_id")//反转的类在联合表中的id
    )
    public Set<Student> getStudentSet() {
    return studentSet;
    }
    Student类
    @ManyToMany(mappedBy="studentSet")
    public Set<Teacher> getSet() {
    return set;
    }
  • csdn发布地址
点击查看更多内容
7人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消