• Hibernate 注解


    步骤

    1. 新建 pojo 并增加注解

    2. 注解写完后,需要在 hibernate.cfg.xml 核心配置中增加:

    <mapping class="pojo类的路径" />
    

    类级别注解

    注解 说明
    @Entity 映射实体类
    @Table 映射数句库表

    @Entity(name="tableName")

    • 必须,注解将一个类声明为一个实体bean。
    • 属性:
      name
      • 可选,对应数据库中的一个表。若表名与实体类名相同,则可以省略。

    @Table(name="", catalog="", schema="")

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

    • 属性:
      name

      • 可选,表示表的名称,默认地,表名和实体名称一致,只有在不一致的情况下才需要指定表名

      catalog

      • 可选,表示Catalog名称,默认为Catalog("").

      schema

      • 可选 , 表示 Schema 名称 , 默认为Schema("").

    属性级别注解

    注解 说明
    @Id 映射生成主键
    @Version 定义乐观锁
    @Column 映射表的列
    @Transient 定义暂态属性

    1. 与主键相关注解

    @Id

    • 必须,定义了映射到数据库表的主键的属性,一个实体只能有一个属性被映射为主键,置于 getXxxx() 前。

    @GeneratedValue(strategy=GenerationType, generator="")

    • 可选,用于定义主键生成策略。

    • 属性:

      Strategy

      • 表示主键生成策略,取值有:
    取值 说明
    GenerationType.AUTO 根据底层数据库自动选择(默认),若数据库支持自动增长类型,则为自动增长。
    GenerationType.INDENTITY 根据数据库的Identity字段生成,支持DB2、MySQL、 MS、SQLServer、SyBase与HyperanoicSQL数据库的Identity 类型主键。
    GenerationType.SEQUENCE 使用Sequence来决定主键的取值,适合Oracle、DB2等支持Sequence的数据库,一般结合@SequenceGenerator使用。(Oracle没有自动增长类型,只能用Sequence)
    GenerationType.TABLE 使用指定表来决定主键取值,结合@TableGenerator使用。

    2. 与非主键相关注解

    @Version

    • 可以在实体bean中使用@Version注解,通过这种方式可添加对乐观锁定的支持。

    @Basic

    • 用于声明属性的存取策略

      @Basic(fetch=FetchType.EAGER) 即时获取(默认的存取策略)

      @Basic(fetch=FetchType.LAZY) 延迟获取

    @Temporal

    • 用于定义映射到数据库的时间精度:

      @Temporal(TemporalType=DATE) 日期

      @Temporal(TemporalType=TIME) 时间

      @Temporal(TemporalType=TIMESTAMP) 两者兼具

    @Column

    • 可将属性映射到列,使用该注解来覆盖默认值,@Column描述了数据库表中该字段的详细定义,这对于根据 JPA 注解生成数据库表结构的工具非常有作用。

    • 属性:

      name

      • 可选,表示数据库表中该字段的名称,默认情形属性名称一致

      nullable

      • 可选,表示该字段是否允许为null,默认为 true

      unique

      • 可选,表示该字段是否是唯一标识,默认为 false

      length

      • 可选,表示该字段的大小,仅对 String 类型的字段有效,默认值255.

      insertable

      • 可选,表示在ORM框架执行插入操作时,该字段是否应出现 INSETRT 语句中,默认为true

      updateable

      • 可选,表示在ORM框架执行更新操作时,该字段是否应该出现在 UPDATE语句中,默认为true。对于一经创建就不可以更改的字段,该属性非常有用,如对于birthday字段。

      columnDefinition

      • 可选,表示该字段在数据库中的实际类型。通常ORM框架可以根据属性类型自动判断数据库中字段的类型,但是对于Date类型仍无法确定数据库中字段类型究竟是DATE,TIME还是TIMESTAMP。 此外 ,String的默认映射类型为VARCHAR,如果要将String 类型映射到特定数据库的BLOB或TEXT字段类型,该属性非常有用。

      @Transient

      • 可选,表示该属性并非一个到数据库表的字段的映射,ORM框架将忽略该属性,如果一个属性并非数据库表的字段映射,就务必将其标示为@Transient,否则ORM框架默认其注解为 @Basic

    映射实体bean的关联关系

    一、关联映射的一些共有属性

    @OneToOne、@OneToMany、@ManyToOne、@ManyToMany的共有属性:

    1. fetch 配置加载方式

    取值 说明
    Fetch.EAGER 及时加载,多对一默认是Fetch.EAGER
    Fetch.LAZY 延迟加载,一对多默认是Fetch.LAZY

    2. cascade 设置级联方式

    取值 说明
    CascadeType.PERSIST 保存
    CascadeType.REMOVE 删除
    CascadeType.MERGE 修改
    CascadeType.REFRESH 刷新
    CascadeType.ALL 全部

    3. targetEntity 配置集合属性类型

    如:@OneToMany(targetEntity=Book.class)

    @JoinColumn

    • 可选,用于描述一个关联的字段。
    • 属性:
      name
      • 该字段的名称,由于@JoinColumn描述的是一个关联字段,如ManyToOne,则默认的名称由其关联的实体决定。

    一对一

    @Entity
    public class Company {
    	@Id
    	@GeneratedValue(strategy=GenerationType.AUTO)
    	private int id;
    	private String name;
    	
    	@OneToOne(cascade=CascadeType.ALL)
    	private Address address;
    	// 省略了 get 和 set 方法
    }
    
    @Entity
    public class Address {
    	@Id
    	@GeneratedValue(strategy=GenerationType.AUTO)
    	private int id;
    	private String city;
    	
    	@OneToOne(cascade=CascadeType.ALL,mappedBy="address")	
    	// mappedBy="address" 映射关系交给了对方(Company)维护,相当于 inverse="true" 放权
    	private Company company;
    	// 省略了 get 和 set 方法
    }
    
    

    一对多 / 多对一

    @Entity
    public class Employee {
    	// 员工 多方
    	@Id
    	@GeneratedValue(strategy=GenerationType.AUTO)
    	private int empid;
    	private String ename;
    	
    	@ManyToOne(cascade=CascadeType.ALL)
    	private Department department;
    	// 省略了 get 和 set 方法
    }
    
    @Entity
    public class Department {
    	// 部门 一方
    	@Id
    	@GeneratedValue(strategy=GenerationType.AUTO)
    	private int deptid;
    	private String dname;
    	
    	@OneToMany(mappedBy="department")
    	// mappedBy="department" 映射关系交给了对方(Employee)维护,相当于 inverse="true" 放权
    	private Set<Employee> employees = new HashSet<Employee>();
    	// 省略了 get 和 set 方法
    }
    

    多对多

    @Entity
    public class Student {
    	@Id
    	@GeneratedValue(strategy=GenerationType.AUTO)
    	private int id;
    	private String name;
    	
    	@ManyToMany(cascade=CascadeType.ALL)
    	private Set<Course> courses = new HashSet<Course>();
    	// 省略了 get 和 set 方法
    }
    
    @Entity
    public class Course {
    	@Id
    	@GeneratedValue(strategy=GenerationType.AUTO)
    	private int id;
    	private String name;
    	
    	@ManyToMany(mappedBy="courses")
    	// mappedBy="courses" 映射关系交给了对方维护,相当于 inverse="true" 放权
    	// 一般为被选择的一方放权
    	private Set<Student> students = new HashSet<Student>();
    	// 省略了 get 和 set 方法
    }
    
  • 相关阅读:
    Mybatis中的动态SQL
    Mybatis核心知识点
    Java8之Stream详解
    多线程知识点总结(二)
    多线程知识点总结(一)
    数据库中的行锁和表锁
    数据库中的sql完整性约束
    数据库中的sql语句总结
    全局变量
    打印 输出 debug
  • 原文地址:https://www.cnblogs.com/xzh0717/p/10816232.html
Copyright © 2020-2023  润新知