Hibernate-注解

 

一, 为啥用注解

Hibernate注解使得原本放在xml文件中的信息直接表现在类中

为什么要用注解呢,因为注解可以简洁快速地在编写代码的同时实现映射关系

注解的好处就是语言简洁,即插即用.  坏处就是和xml相比,分散到各个class文件中,不方便修改.

用注解,需要在hibernate.cfg.xml文件中添加使用了注解的实体类的标签

<mapping class="com.test.pojo.Person"/>

 

二,有哪些注解,咋用?

  1.先看示例代码:

@Entity
@Table(name = "person_")
public class Person {
    private int id;
    private String name;
    private int age;

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

    public void setId(int id) {
        this.id = id;
    }
    @Column(name = "name")
    public String getName() {
        return name;
    }

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

    @Column(name = "age")
    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

这是一个简单的使用了注解进行映射的类,可以看到其中的注解所代表的含义.

 

类注解:

(1)@Entity: 表示这是一个实体类,用于映射一个表

(2)@Table(name="person"): 表示这个类映射的表的名字为person

 

属性注解:

(1)@Id: 表示这个属性是表中的主键

(2)@GeneratedValue(strategy = GenerationType.IDENTITY)表示主键的自增长方式

      strategy 指定生成的策略(JPA定义的),这是一个GenerationType。默认是GenerationType. AUTO 
      GenerationType.AUTO 主键由程序控制 
      GenerationType.TABLE 使用一个特定的数据库表格来保存主键 
      GenerationType.IDENTITY 主键由数据库自动生成(主要是自动增长类型) 
      GenerationType.SEQUENCE 根据底层数据库的序列来生成主键,条件是数据库支持序列。(这个值要与generator一起使用) 
      generator 指定生成主键使用的生成器(可能是orcale中的序列)。 

(3)@Column(name="id): 表示这个属性映射到表中的"id"字段

      name 可选,列名(默认值是属性名) 
      unique 可选,是否在该列上设置唯一约束(默认值false) 
      nullable 可选,是否设置该列的值可以为空(默认值false) 
      insertable 可选,该列是否作为生成的insert语句中的一个列(默认值true) 
      updatable 可选,该列是否作为生成的update语句中的一个列(默认值true) 
      columnDefinition 可选,为这个特定列覆盖sql ddl片段(这可能导致无法在不同数据库间移植) 
      table 可选,定义对应的表(默认为主表) 
      length 可选,列长度(默认值255) 
      precision 可选,列十进制精度(decimal precision)(默认值0) 
      scale 可选,如果列十进制数值范围(decimal scale)可用,在此设置(默认值0) 

 

关系注解:

(1) @ManyToOne: 表示多对一关系,  (注解下是一个对象的getter)

      @JoinColumn(name="tid") 表示, 这个关系在表中对应的字段为tid

@Entity
@Table(name = "person_")
public class Person {
    private int id;
    private String name;
    private int age;
    private Teacher teacher;

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

    public void setId(int id) {
        this.id = id;
    }
    @Column(name = "name")
    public String getName() {
        return name;
    }

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

    @Column(name = "age")
    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @ManyToOne
    @JoinColumn(name="tid")
    public Teacher getTeacher(){
        return teacher;
    }

    public void setTeacher(Teacher teacher){
        this.teacher = teacher
    }
}

 

(2)@OneToMany(fetch=FetchType.EAGER): 一对多关系, FetchType表示是否延迟加载  (注解下是一个集合的getter)

     @JoinColumn: 表示映射字段

@Entity
@Table(name = "teacher_")
public class Teacher {
    private int id;
    private String name;
    private Set<Person> persons;

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

    public void setId(int id) {
        this.id = id;
    }
    @Column(name = "name")
    public String getName() {
        return name;
    }

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


    @OneToMany(fetch=FetchType.EAGER)
    @JoinColumn(name="tid")
    public Set<Person> getPersons(){
        return persons;
    }

    public void setPersons(Set<Person> persons){
        this.persons = persons;
    }
}

 

(3)@ManyToMany: 多对多注解

    @JoinTable: 多对多关系映射的表

    @ManyToMany(cascade=CascadeType.ALL,fetch=FetchType.EAGER)  //表示级联方式和是否延迟加载
    @JoinTable(                                                 //表示多对多关系的表的映射
            name="user_product",                               //表名
            joinColumns=@JoinColumn(name="uid"),               
            inverseJoinColumns=@JoinColumn(name="pid")
    )   
    public Set<Product> getProducts() {
        return products;
    }

 这两个注解需要在有多对多关系的类的集合的getter中都写上.

posted @ 2019-04-01 21:04  胡叁安  阅读(146)  评论(0编辑  收藏  举报