zoukankan      html  css  js  c++  java
  • 这次彻底搞懂 Hibernate 映射

    (待更新)
    参考自JPA 2.1 http://docs.jboss.org/hibernate/jpa/2.1/api/

    类级标注

    @Entity(name = "xxx") // 标注实体(可持久化对象)
    // name (String) 实体名,默认是类名,这个名字用于查询时引用实体。
    
    
    @Table(name = "xxx", schema = "xxx") // 标注实体对应的主表(是的还可以有二级表(们))
    // name (String) 表名,默认是类名。
    // schema (String) 表所属的模式名,默认是用户的默认模式名。
    // catalog indexes uniqueConstraints 这仨属性不懂
    

    ## 属性标注
    @Column(name = "xxx") // 标注列
    // name (String) 列名,不写默认是字段名。
    // unique (boolean) 是否唯一,默认是false。
    // nullable (boolean) 是否可为空,默认是true。
    // insertable (boolean) 是否可插入,不可插入就是不能写在insert语句里而是由数据库处理,默认是true。
    // updatable (boolean) 是否可更改,不可更改就是不能写在update语句里而是由数据库处理,默认是true。
    // columnDefinition table length precision scale 都不懂
    

    ## 主键标注
    @Id // 标注主键,如果没有@Column标注,则字段名即为主键列名。
    
    
    @GeneratedValue // 标注主键的生成策略
    // strategy (GenerationType) 数据库生成主键的策略类型,默认是AUTO。
    //     AUTO 表示由数据库决定
    //     IDENTITY 表示数据库是标识列生成主键的(比如MySQL)
    //     SEQUENCE 表示数据库是用序列生成主键的(比如Oracle)
    //     TABLE 表示数据库是用表生成主键的
    // generator (String) 由SequenceGenerator或TableGenerator标注的生成器名,默认是数据库提供的生成器。
    
    
    @SequenceGenerator(name="xxx", sequenceName="xxx") // 标注序列生成器
    // name (String) 生成器名,必须要有且唯一,用于引用生成器。
    // sequenceName (String) 数据库中用来生成主键的序列名,默认是数据库中定义好的。
    // catalog schema initialValue allocationSize 不懂
    
    
    @TableGenerator(name="xxx", table="xxx") // 标注表生成器
    // name (String) 生成器名,必须要有且唯一,用于引用生成器。
    // table (String) 数据库中用来存放主键的表名,默认是数据库中定义好的。
    // catalog ... 还有好多属性都不懂
    

    ## 关系标注
    @OneToOne // 标注一对一关系(定义一种单向的与另一个实体关联的关系,不必在目标实体中标注,可以根据引用的对象类型推测出来;
              // 如果这种关系是双向的,则必须在目标实体中用OneToOne的mappedBy属性声明(owing-side)实体的字段名)
    // targetEntity (Class) 目标实体的类,默认是字段的类
    // cascade (CascadeType[]) 级联类型组,默认是空
    //     ALL
    //     DETACH
    //     MERGE
    //     PERSIST
    //     REFRESH
    //     REMOVE
    // fetch (FetchType) 抓取类型,默认是EAGER
    //     EAGER
    //     LAZY
    // optional (boolean) 是否可选,默认是true。
    // mappedBy (String) 拥有这个关系的实体的字段名。
    // orphanRemoval 不懂
    

    举例 →

    // 1. 用外键关联的一对一关系
    // Customer.java
    @OneToOne(optional = false)
    @JoinColumn(name = "CUSTREC_ID", unique = true, nullable = false, updatable = false)
    public CustomerRecord getCustomerRecord() { return customerRecord; }
    
    // CustomerRecord.java
    @OneToOne(optional = false, mappedBy="customerRecord")
    public Customer getCustomer() { return customer; }
    
    
    // 2. 主键共享的一对一关系
    // Employee.java
    @Entity
    public class Employee {
        @Id
        Integer id;
        
        @OneToOne
        @MapsId
        EmployeeInfo info;
        ...
    }
    
    // EmployeeInfo.java
    @Entity
    public class EmloyeeInfo {
        @Id
        Integer id;
        ...
    }
    
    
    // 3. 用嵌入类关联的一对一关系(不懂,先略过)
    

    举例结束


    @OneToMany // 标注一对多关系(如果集合用范型声明了元素类型,则不需要在目标实体)
    // 属性同OneToOne,除了没有optional,fetch的默认是LAZY。
    

    举例 →

    // 1. 使用了范型的一对多关系
    // Customer.java
    @OneToMany(cascade = ALL, mappedBy = "customer")
    public Set<Order> getOrders() { return orders; }
    
    // Order.java
    @ManyToOne
    @JoinColumn(name = "CUST_ID", nullable = false)
    public Customer getCustomer() { return customer; }
    
    
    // 2. 没有使用范型的一对多关系
    // Customer.java
    @OneToMany(targetEntity = com.duan.Order.class, cascade = ALL, mappedBy = "customer")
    public Set getOrders() { return orders; }
    
    // Order.java
    @ManyToOne
    @JoinColumn(name = "CUST_ID", nullable = false)
    public Customer getCustomer() { return customer; }
    
    
    // 3. 用外键关联的单向一对多关系
    // Customer.java
    @OneToMany(orphanRemoval = true)
    @JoinColumn(name = "CUST_ID") // join column is in table for Order
    public Set<Order> getOrders() { return orders; }
    

    举例结束


    @ManyToOne // 标注多对一关系(定义一种单向关系;如果是双向,则必须在一方的OneToMany中注明mappedBy属性)
    // 属性同OneToOne,除了没有mappedBy和orphanRemoval。
    

    举例 →

    // 1. 
    @ManyToOne(optional = false)
    @JoinColumn(name = "CUST_ID", nullable = false, updatable = false)
    public Customer getCustomer() { return customer; }
    
    
    // 2. 嵌入类,不懂,略过
    

    举例结束


    @ManyToMany // 标注多对多关系
    

    @JoinColumn // 声明实体关系中用来连接的列
    // name (String)
  • 相关阅读:
    Ionic移动应用框架
    JavaScript为iphone添加到主屏幕
    移动前端:在手机上隐藏地址工具栏
    Swipe.js支持网页点击和数字导航
    String类的概述和常用方法
    今天的学习
    集合的区别
    面向对象总结
    面向对象的封装
    方法的多态中的重写
  • 原文地址:https://www.cnblogs.com/hippiebaby/p/5465725.html
Copyright © 2011-2022 走看看