zoukankan      html  css  js  c++  java
  • HIbernate实体类注解配置

    一、类级别注解

    1、@Entity(name="EntityName") 

    必须

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

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

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

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

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

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

    二、属性级别注解

    1、@id

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

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

    可选

    strategy:表示主键生成策略,有AUTO,INDENTITY,SEQUENCE 和 TABLE 4种,分别表示让ORM框架自动选择,根据数据库的Identity字段自动生成(主要是自动增长类型的主键,适用于sql server,mysql,DB2,MS等数据库中,oracle不适用),根据数据库表的Sequence字段生成(oracle,DB2使用该种),使用一个特定的数据库表格来保存主键,默认为AUTO

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

    示例:

    @Id
    @GeneratedValues(strategy=StrategyType.INDETITY)
    public int getId() {
        return id;
    }

    3、@Basic(fetch=FetchType,optional=true)

    可选,@Basic表示一个简单的属性到数据库表的字段的映射,对于没有任何标注的getXxxx()方法,默认即为@Basic

    fetch: 表示该属性的读取策略,有EAGER和LAZY两种,分别表示主支抓取和延迟加载,默认为EAGER.

    optional:表示该属性是否允许为null,默认为true

    示例:

    @Basic(optional=false)
    public String getAddress() {
        return address;
    }

    4、@Column

    可选,@Column描述了数据库表中该字段的详细定义,这对于根据JPA注解生成数据库表结构的工具非常有作用.

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

    nullable:表示该字段是否允许为null,默认为true

    unique:表示该字段是否是唯一标识,默认为false

    length:表示该字段的大小,仅对String类型的字段有效

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

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

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

    示例:

    @Column(name="BIRTH",nullable="false",columnDefinition="DATE")
    public String getBithday() {
        return birthday;
    }

    5、@Temporal

    可选,用于定义映射到数据库的时间精度

    @Temporal(TemporalType=DATE)       日期

    @Temporal(TemporalType=TIME)       时间

    @Temporal(TemporalType=TIMESTAMP) 两者兼具

    6、@Transient

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

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

    示例:

    //根据birth计算出age属性
    @Transient
    public int getAge() {
        return getYear(new Date()) - getYear(birth);
    }

     三、映射继承关系

    1、@Inheritance(strategy)

    定义所选择的策略. 这个注解需要在每个类层次结构(class hierarchy) 最顶端的实体类上使用

    strategy继承类所选策略,InheritanceType.TABLE_PER_CLASS,InheritanceType.SINGLE_TABLE,InheritanceType.JOINED

    2、@MappedSuperclass

    可选,将超类的JPA注解传递给子类,使子类能够继承超类的JPA注解。

    • 标注为@MappedSuperclass的类将不是一个完整的实体类,他将不会映射到数据库表,但是他的属性都将映射到其子类的数据库字段中。
    • 标注为@MappedSuperclass的类不能再标注@Entity或@Table注解,也无需实现序列化接口。

    示例:

    @MappedSuperclass 
    public class Employee() { 
        .... 
    } 
       
    @Entity 
    @Table(name="engineer")
    public class Engineer extends Employee { 
        ..... 
    } 
    
    @Entity 
    @Table(name="manager")
    public class Manager extends Employee { 
        ..... 
    }

    3、@Embedded

    可选

    @Embedded将几个字段组合成一个类,并作为整个Entity的一个属性.

    例如User包括id,name,city,street,zip属性.

    我们希望city,street,zip属性映射为Address对象.这样,User对象将具有id,name和address这三个属性.

    Address对象必须定义为@Embededable

    示例:

    @Embeddable 
    public class Address {city,street,zip} 
    
    @Entity
    @Table(name="user") 
    public class User { 
        @Embedded 
        @AttributeOverrides( {@AttributeOverride(name = "firstName", column = @Column(name = "first_name")),...})
        public Address getAddress() { 
            .......... 
        } 
    }    

    四、映射实体bean的关联关系

    1、共有属性

    1.1、fetch

    配置加载方式

    Fetch.EAGER -  及时加载,多对一默认是Fetch.EAGER 

    Fetch.LAZY - 延迟加载,一对多默认是Fetch.LAZY

    1.2、cascade

    设置级联方式

    CascadeType.PERSIST - 保存

    CascadeType.REMOVE - 删除

    CascadeType.MERGE - 修改

    CascadeType.REFRESH - 刷新

    CascadeType.ALL - 全部

    1.3、targetEntity

    配置集合属性类型,如:@OneToMany(targetEntity=Book.class)

    1.4、@JoinColumn

    可选

    @JoinColumn和@Column类似,这里描述的不是一个简单字段,而是一个关联字段(通常是外键),例如.描述一个@ManyToOne的字段.

    name:该字段的名称.由于@JoinColumn描述的是一个关联字段,如ManyToOne,则默认的名称由其关联的实体决定.

    例如,实体Order有一个user属性来关联实体User,则Order的user属性为一个外键,

    其默认的名称为实体User的名称+下划线+实体User的主键名称

    2、@ManyToOne(fetch=FetchType,cascade=CascadeType)

    可选,表示一个多对一的映射,该注解标注的属性通常是数据库表的外键

    optional:是否允许该字段为null,该属性应该根据数据库表的外键约束来确定,默认为true

    fetch:表示抓取策略,默认为FetchType.EAGER

    cascade:表示默认的级联操作策略,可以指定为ALL,PERSIST,MERGE,REFRESH和REMOVE中的若干组合,默认为无级联操作

    targetEntity:表示该属性关联的实体类型.该属性通常不必指定,ORM框架根据属性类型自动判断targetEntity.

    示例:

        //订单Order和用户User是一个ManyToOne的关系 ,@JoinColumn定义外键列名
        //在Order类中定义 
        @ManyToOne() 
        @JoinColumn(name="userid") 
        public User getUser() { 
           return user; 
        }

    3、@OneToMany(fetch=FetchType,cascade=CascadeType)

    可选,描述一个一对多的关联,该属性应该为集体类型,在数据库中并没有实际字段。默认会使用连接表做一对多关联,添加@JoinColumn(name="xxx_id") 后,就会使用外键关联,而不使用连接表了。

    fetch:表示抓取策略,默认为FetchType.LAZY,因为关联的多个对象通常不必从数据库预先读取到内存

    cascade:表示级联操作策略,对于OneToMany类型的关联非常重要,通常该实体更新或删除时,其关联的实体也应当被更新或删除

    例如:实体User和Order是OneToMany的关系,则实体User被删除时,其关联的实体Order也应该被全部删除

    示例:

        //用户User和订单Order是一个OneToMany的关系,@JoinColumn(name="对方的数据库表外键列名") 
        //在User类中定义 
        @OneToMany(mappyedBy="user") 
        @JoinColumn(name="userid")
        public <Set>Order getOrders() { 
           return orders; 
        }

    4、@OneToOne(fetch=FetchType,cascade=CascadeType)

    可选,描述一个一对一的关联

    fetch:表示抓取策略,默认为FetchType.LAZY

    cascade:表示级联操作策略

    (1)主表类A与从表类B的主键值相对应。
     主表:

    @OneToOne(cascade = CascadeType.ALL)
    @PrimaryKeyJoinColumn
    public B getB(){
        Return b;
    }

    从表:无

    (2)主表A中有一个从表属性是B类型的b

    主表:

    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name="主表外键")   //这里指定的是数据库中的外键字段。
    public B getB(){
        return b;
    }

    从表:无

    (3)主表A中有一个从表属性是B类型的b,同时,从表B中有一个主表属性是A类型的a
    主表:

    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name="主表外键")   //这里指定的是数据库中的外键字段。
    public B getB(){
        return b;
    }

    从表:

    @OneToOne(mappedBy = "主表类中的从表属性")
    public 主表类 get主表类(){
        return 主表对象
    }

      注意:@JoinColumn是可选的。默认值是从表变量名+"_"+从表的主键(注意,这里加的是主键。而不是主键对应的变量)。

    示例:

    @OneToOne(fetch=FetchType.LAZY)
    public Blog getBlog() {
        return blog;
    }

    5、@ManyToMany

    可选,描述一个多对多的关联.多对多关联上是两个一对多关联,但是在ManyToMany描述中,中间表是由ORM框架自动处理

    targetEntity:表示多对多关联的另一个实体类的全名,例如:package.Book.class

    mappedBy:表示多对多关联的另一个实体类的对应集合属性名称

    fetch:表示抓取策略

    cascade:表示级联操作策略

    示例:

      Teacher实体表示教师,Student实体表示学生,为了描述教师和学生关系,可以在Teacher和Student之间建立ManyToMany关联

    public class Student{
        private Set<Teacher> teachers=new HashSet<Teacher>();
        @ManyToMany
        @JoinTable(name="teacher_student",joinColumns={@JoinColumn(name="sid")},inverseJoinColumns={@JoinColumn(name="tid")})
        public Set<Teacher> getTeachers() {
            return teachers;
        }
    }
    public class Teacher{
        private Set<Student> students=new HashSet<Student>();
        @ManyToMany(mappedBy="teachers")
        public Set<Student> getStudents() {
            return students;
        }
    }

    6、@JoinTable

    通过表关联的方式来映射一对多或者多对多的关系时,要使用@JoinTable这个标记

    无注解属性的默认值

    1)如果属性为单一类型,则映射为@Basic,

    2)如果属性对应的类型定义了@Embeddable注解,则映射为@Embedded

    3)如果属性对应的类型实现了Serializable, 则属性被映射为@Basic并在一个列中保存该对象的serialized版本

    4)如果该属性的类型为java.sql.Clob 或 java.sql.Blob,则作为@Lob并映射到适当的LobType.。

     

  • 相关阅读:
    Elementary Methods in Number Theory Exercise 1.3.13
    Elementary Methods in Number Theory Exercise 1.3.17, 1.3.18, 1.3.19, 1.3.20, 1.3.21
    数论概论(Joseph H.Silverman) 习题 5.3,Elementary methods in number theory exercise 1.3.23
    Elementary Methods in Number Theory Exercise 1.2.31
    数论概论(Joseph H.Silverman) 习题 5.3,Elementary methods in number theory exercise 1.3.23
    Elementary Methods in Number Theory Exercise 1.3.13
    Elementary Methods in Number Theory Exercise 1.3.17, 1.3.18, 1.3.19, 1.3.20, 1.3.21
    Elementary Methods in Number Theory Exercise 1.2.31
    Elementary Methods in Number Theory Exercise 1.2.26 The Heisenberg group
    4__面向对象的PHP之作用域
  • 原文地址:https://www.cnblogs.com/SaraMoring/p/5638921.html
Copyright © 2011-2022 走看看