zoukankan      html  css  js  c++  java
  • JPA 中注解的作用

    JPA全称Java Persistence API.JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。
            JPA由EJB 3.0软件专家组开发,作为JSR-220实现的一部分。但它不囿于EJB 3.0,你可以在Web应用、甚至桌面应用中使用。JPA的宗旨是为POJO提供持久化标准规范.
            JPA的总体思想和现有Hibernate、TopLink,JDO等ORM框架大体一致。总的来说,JPA包括以下3方面的技术:
            (1)ORM映射元数据
            JPA支持XML和JDK 5.0注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中;
            (2)JPA 的API
            用来操作实体对象,执行CRUD操作,框架在后台替我们完成所有的事情,开发者从繁琐的JDBC和SQL代码中解脱出来。
            (3)查询语言
            这是持久化操作中很重要的一个方面,通过面向对象而非面向数据库的查询语言查询数据,避免程序的SQL语句紧密耦合。

            下面先后现看第一条"ORM映射元数据",总结一下JPA中常用的注解标签. 
      
    1.设置Pojo为实体    
    @Entity //标识这个pojo是一个jpa实体       
    public class Users implements Serializable {       
    }      
      
      
    2.设置表名    
    @Entity       
    @Table(name = "users") //指定表名为users       
    public class Users implements Serializable {       
    }      
      
      
    3.设置主键   
    public class Users implements Serializable {       
    @Id       
    private String userCode;      
      
      
    4. 设置字段类型  
    通过@Column注解设置,包含的可设置属性如下  
        .name:字段名  
    .unique:是否唯一  
    .nullable:是否可以为空  
    .inserttable:是否可以插入  
    .updateable:是否可以更新  
    .columnDefinition: 定义建表时创建此列的DDL  
    .secondaryTable: 从表名。如果此列不建在主表上(默认建在主表),该属性定义该列所在从表的名字。  
      
      
    @Column(name = "user_code", nullable = false, length=32)//设置属性userCode对应的字段为user_code,长度为32,非空       
    private String userCode;       
    @Column(name = "user_wages", nullable = true, precision=12, scale=2)//设置属性wages对应的字段为user_wages,12位数字可保留两位小数,可以为空       
    private double wages;       
    @Temporal(TemporalType.DATE)//设置为时间类型       
    private Date joinDate;       
      
      
    5.字段排序  
    在加载数据的时候可以为其指定顺序,使用@OrderBy注解实现    
    @Table(name = "USERS")       
    public class User {       
    @OrderBy(name = "group_name ASC, name DESC")       
    private List books = new ArrayList();       
    }      
      
      
    6.主键生成策略

           (1)identity主键自增,这种方式依赖于具体的数据库,如果数据库不支持自增主键,那么这个类型是没法用的        

    public class Users implements Serializable {       

    @Id       
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    @Column(name = "user_id", nullable = false)       
    private int userId;            
         

          (2)借助一个表来实现主键自增, 通过一个表来实现主键id的自增,这种方式不依赖于具体的数据库,可以解决数据迁移的问题 

    public class Users implements Serializable {       

    @Id       
    @GeneratedValue(strategy=GenerationType.TABLE)      
    @Column(name = "user_code", nullable = false)       
    private String userCode;          

         

         (3)sequence主键自增,通过Sequence来实现表主键自增,这种方式依赖于数据库是否有SEQUENCE,如果没有就不能用       

    public class Users implements Serializable {       
    @Id       
    @GeneratedValue(strategy=GenerationType.SEQUENCE)
    @SequenceGenerator(name="seq_user")       
    @Column(name = "user_id", nullable = false)       
    private int userId;      

           

          此外,一些实现了JPA规范的ORM映射框架,还提供了自己支持的主键生成策略,比如使用hibernate-Annotation来实现持久化映射,就可以使用Hibernate提供的UUID主键生成策略.

      
      
    7.一对多双向映射关系  
    有T_One和T_Many两个表,他们是一对多的关系,注解范例如下  

    主Pojo    

    @Entity       
    @Table(name = "T_ONE")       
    public class One implements Serializable {       
    private static final long serialVersionUID = 1L;       
    @Id       
    @Column(name = "ONE_ID", nullable = false)       
    private String oneId;       
    @Column(name = "DESCRIPTION")       
    private String description;       
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "oneId")//指向多的那方的pojo的关联外键字段       
    private Collection<Many> manyCollection;       
      
      
    子Pojo    
    @Entity       
    @Table(name = "T_MANY")       
    public class Many implements Serializable {       
    private static final long serialVersionUID = 1L;       
    @Id       
    @Column(name = "MANY_ID", nullable = false)       
    private String manyId;       
    @Column(name = "DESCRIPTION")       
    private String description;       
         
    @JoinColumn(name = "ONE_ID", referencedColumnName = "ONE_ID")//设置对应数据表的列名和引用的数据表的列名       
    @ManyToOne//设置在“一方”pojo的外键字段上       
    private One oneId;       
      
    说明:

       一对多双向关联跟多对一是一样的,在多端生成一个外键,不生成第三张表来管理对应关系,由外键来管理对应关系 

      
    8.多对多映射关系  
    貌似多对多关系不需要设置级联,以前用hibernate的时候着实为多对多的级联头疼了一阵子,JPA的多对多还需要实际的尝试一下才能有所体会。  
    估计JPA的多对多也是可以转换成两个一对多的。  
      
    第一个Pojo    
    @Entity       
    @Table(name = "T_MANYA")       
    public class ManyA implements Serializable {       
    private static final long serialVersionUID = 1L;       
    @Id       
    @Column(name = "MANYA_ID", nullable = false)       
    private String manyaId;       
    @Column(name = "DESCRIPTION")       
    private String description;       
    @ManyToMany       
    @JoinTable(name = "TMANY1_TMANY2", joinColumns = {@JoinColumn(name = "MANYA_ID", referencedColumnName = "MANYA_ID")}  
    private Collection<ManyB> manybIdCollection;       
      
      
    第二个Pojo    
    @Entity       
    @Table(name = "T_MANYB")       
    public class ManyB implements Serializable {       
    private static final long serialVersionUID = 1L;       
    @Id       
    @Column(name = "MANYB_ID", nullable = false)       
    private String manybId;       
    @Column(name = "DESCRIPTION")       
    private String description;       
    @ManyToMany(mappedBy = "manybIdCollection")       
    private Collection<ManyA> manyaIdCollection;       
      
      
      

    9.一对一外键映射关系  

    主Pojo    
    @Entity       
    @Table(name = "T_ONEA")       
    public class OneA implements Serializable {       
    private static final long serialVersionUID = 1L;       
    @Id       
    @Column(name = "ONEA_ID", nullable = false)       
    private String oneaId;       
    @Column(name = "DESCRIPTION")       
    private String description;       
    @OneToOne(cascade = CascadeType.ALL, mappedBy = "oneA")//主Pojo这方的设置比较简单,只要设置好级联和映射到从Pojo的外键就可以了。       
    private OneB oneB;      

    从Pojo  
    @Entity       
    @Table(name = "T_ONEB")       
    public class OneB implements Serializable {       
    private static final long serialVersionUID = 1L;       
    @Id       
    @Column(name = "ONEA_ID", nullable = false)       
    private String oneaId;       
    @Column(name = "DESCRIPTION")       
    private String description;       
    @JoinColumn(name = "ONEA_ID", unique=ture referencedColumnName = "ONEA_ID", insertable = false)//设置从方指向主方的关联外键,这个ONEA_ID

    其实是表T_ONEA的主键       
    @OneToOne       
    private OneA oneA;       
      
      
      
    10 大字段    
    @Lob //对应Blob字段类型       
    @Column(name = "PHOTO")       
    private Serializable photo;       
    @Lob //对应Clob字段类型       
    @Column(name = "DESCRIPTION")       
    private String description;      
      
      
      
    11.瞬时字段  :不需要与数据库映射的字段,在保存的时候不需要保存倒数据库  
      
      
    @Transient       
    private int tempValue;       
         
    public int getTempValue(){       
    get tempValue;       
    }       
         
    public void setTempValue(int value){       
    this.tempValue = value;       

    }      

    12.类的继承映射 

    JPA对于具有父子关系的类,对于父类必须声明继承实体的映射策略,对于继承实体,Java.persistence.InheritanceType定义了3种映射策略(跟Hibernate类继承的映射原理相同):

    SINGLE_TABLE:父子类都保存在同一个表中,通过字段值进行区分。此方法推荐使用

    JOINED:父子类相同的部分保存在同一个表中,不同的部门分开存放,通过连接不同的表获取完整数据。

    TABLE_PER_CLASS:每一个类对应自己的表,一般不推荐采用这种方式。

  • 相关阅读:
    取得窗口大小和窗口位置兼容所有浏览器的js代码
    一个简单易用的导出Excel类
    如何快速启动chrome插件
    网页表单设计案例
    Ubuntu下的打包解包
    The source file is different from when the module was built. Would you like the debugger to use it anyway?
    FFisher分布
    kalman filter
    Group delay Matlab simulate
    24位位图格式解析
  • 原文地址:https://www.cnblogs.com/writeLessDoMore/p/6841012.html
Copyright © 2011-2022 走看看