`
nannan408
  • 浏览: 1783849 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

架构师之ORM-----------JPA和hibernate注解之JPA

 
阅读更多
1.前言。
  我们用到的hibernate注解很多都是从jpa而来,而jpa很多是从ejb里面来。
2.详述。
 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:每一个类对应自己的表,一般不推荐采用这种方式


摘自:http://blog.csdn.net/wanghuan203/article/details/8698102,感谢whuan博主无私的奉献。
分享到:
评论

相关推荐

    velocity spring jpa hibernate 整合

    在这个项目中,"velocity spring jpa hibernate 整合"涉及到的是四个关键组件:Velocity、Spring、JPA(Java Persistence API)和Hibernate。让我们逐一深入理解这些技术并探讨它们如何协同工作。 1. **Velocity**...

    SpringBoot整合Hibernate纯注解版

    3. **启用JPA和Hibernate**: 在`application.properties`中,开启JPA并指定使用Hibernate作为实现。 ```properties spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=true ``` 4. **实体类注解**: 创建...

    hibernate技术研究对比总结

    该文档适用于 Java 开发者、系统架构师以及对 ORM 解决方案感兴趣的任何人。 1.4 **参考文档** - Hibernate 官方文档 - JPA(Java Persistence API)规范 - 其他 ORM 框架的文档,如 MyBatis 和 EclipseLink 1.5 *...

    JavaEE系统架构师学习路线之高级篇

    ### JavaEE系统架构师学习路线之高级篇 #### 一、Java高级架构师设计 - 基础深入 1. **J2SE深入讲解** - J2SE(Java 2 Standard Edition)是Java标准版的基础,对于架构师而言,深入了解J2SE中的核心概念和技术是...

    J2EE架构师手册

    4. **Java Persistence API (JPA)**:J2EE提供了一种标准的方式来管理和操作数据库,JPA允许开发者以面向对象的方式处理关系型数据,通过ORM(Object-Relational Mapping)工具如Hibernate或EclipseLink实现。...

    JavaEE企业级分布式高级架构师培训.zip

    Hibernate作为JPA的实现之一,提供了丰富的功能和优秀的性能。这部分会讲解实体管理、事务控制和查询语言(HQL)。 4. **Spring框架**:Spring是JavaEE开发中最常用的应用框架,它包含IoC容器、AOP、MVC、数据访问、...

    Spring+SpringMVC+Hibernate(纯注解版本)

    Spring、SpringMVC和Hibernate是Java开发中常用的三大框架,它们各自负责不同的职责,并通过合理的集成,构建出高效、可维护的Web应用。本项目采用纯注解版本,旨在简化配置,提高开发效率。 Spring框架是Java企业...

    Java EE 学习方向

    ### Java EE 学习方向详解 #### 一、Java核心编程技术 ...通过上述内容的学习,不仅能够成为一名合格的Java程序员,还能够逐渐成长为Java高级软件工程师乃至Java系统架构师,具备设计和构建复杂系统的能力。

    JAVA面试题集.rar

    - ORM框架:学习Hibernate或JPA的使用,理解对象关系映射。 14. **并发编程** - volatile关键字:理解其在并发编程中的作用。 - Atomic类:了解原子操作类的使用,如AtomicInteger、AtomicReference等。 - Lock...

    springboot摄影跟拍预定管理系统--论文.rar

    1. 数据存储:可能使用Spring Data JPA与Hibernate进行ORM操作,与MySQL等数据库交互。 2. 前端框架:如Thymeleaf或Freemarker进行视图渲染,Bootstrap进行界面美化。 3. 安全管理:Spring Security用于用户认证和...

    工作流各项对比.pdf

    根据给定文件的部分内容,我们可以识别出与工作流相关的多个技术和工具,以及它们之间可能的对比关系。...在工作流系统设计和实施中,合理选择和对比这些工具能够帮助开发人员和架构师制定更有效的工作流解决方案。

    EJB3 In Action download

    《EJB3 in Action》是一本深入探讨Enterprise JavaBeans(EJB)3.0技术的专业书籍,适合Java开发者和企业级应用架构师阅读。EJB3是Java EE平台中的核心组件,它为构建可扩展、健壮且具有事务管理能力的企业级应用...

    基于Springboot的学生心理压力咨询评判(有报告) Javaee项目,springboot项目

    2. **Spring Data JPA**:用于简化数据库操作,通过注解的方式与数据库进行交互,支持多种ORM框架如Hibernate。 3. **Thymeleaf或Freemarker**:作为视图层模板引擎,用于渲染HTML页面。 4. **RESTful API设计**:...

Global site tag (gtag.js) - Google Analytics