`
flowercat
  • 浏览: 358198 次
社区版块
存档分类
最新评论

JPA注解说明

    博客分类:
  • java
阅读更多

使用注解元数据
基本注解:
例子:
@Entity(name = "T_TOPIC") ①
public class Topic implements Serializable ...{

@Id ② -1

@GeneratedValue(strategy = GenerationType.TABLE) ② -2

@Column(name = "TOPIC_ID") ② -3

private int topicId;

@Column(name = "TOPIC_TITLE", length = 100) ③
private String topicTitle;

@Column(name = "TOPIC_TIME") @Temporal(TemporalType.DATE) ④
private Date topicTime;

@Column(name = "TOPIC_VIEWS")

private int topicViews;

...

}



解释:
① Entity 标明该类 (Topic) 为一个实体类,它对应数据库中的表表名是 T_TOPIC ,这里也可以写成: @Entity

@Table(name = "T_TOPIC") 其作用都是一样的
② -1 Id 标明该属性对应数据表中的主键
② -2 GeneratedValue 通过 strategy 属性指明主键生成策略,默认情况下, JPA 自动选择一个最适合底层数据库的主键生成策略。在 javax.persistence.GenerationType 中定义了以下几种可供选择的策略:
1) IDENTITY :表自增键字段, Oracle 不支持这种方式;
2) AUTO : JPA 自动选择合适的策略,是默认选项;
3) SEQUENCE :通过序列产生主键,通过 @SequenceGenerator 注解指定序列名, MySql 不支持这种方式;
4) TABLE :通过表产生主键,框架借由表模拟序列产生主键,使用该策略可以使应用更易于数据库移植。
② -3 Column 标明这个属性是数据表中的一列,该列的名字是 TOPIC_ID

③ Column 的一个属性 length 指明的是该属性的允许的长度。 ( 个人认为设定该属性只是对于程序中操作该属性时增加了一验证过程,对数据库中该列原来的设置并没有影响,但是 length 属性指定的值必须不能大于数据库创建表时给该列限制的最大长度否则会出错 )

④ Temporal(TemporalType.DATE) :如果属性是时间类型,因为数据表对时间类型有更严格的划分,所以必须指定具体时间类型。在 javax.persistence.TemporalType 枚举中定义了 3 种时间类型:
1) DATE :等于 java.sql.Date

2) TIME :等于 java.sql.Time

3) TIMESTAMP :等于 java.sql.Timestamp



继承关系注解:
对继承关系进行注解,必须在 父类 中声明继承实体的映射策略。
例子:
@Entity(name = "T_TOPIC")

@Inheritance(strategy = InheritanceType.SINGLE_TABLE) ① @DiscriminatorColumn(name = "TOPIC_TYPE", discriminatorType =

DiscriminatorType.INTEGER, length = 1) ②
@DiscriminatorValue(value="1") ③
public class Topic implements Serializable ...{ … }



解释:
① Inheritance 通过 strategy 属性指明实体的继承策略。
在 javax.persistence.InheritanceType 定义了 3 种映射策略:
1) SINGLE_TABLE :父子类都保存到同一个表中,通过字段值进行区分。
2) JOINED :父子类相同的部分保存在同一个表中,不同的部分分开存放,通过表连接获取完整数据;
3) TABLE_PER_CLASS :每一个类对应自己的表,一般不推荐采用这种方式。
② DiscriminatorColumn 如果继承策略采用第一种继承策略,则需要指明区分父子类的字段, DiscriminatorColumn 就是用来指明区分字段的注解。
③ DiscriminatorValue 同样的采用第一种继承策略通过字段区分父子类,则用这个注解给该实体的区分字段赋值在这里赋的值为 ”1”.



关联关系注解:
例子:
@Entity @DiscriminatorValue(value="2") ①
public class PollTopic extends Topic ...{ ②继承于 Topic 实体
private boolean multiple; ③
@Column(name = "MAX_CHOICES")

private int maxChoices; @OneToMany(mappedBy="pollTopic",cascade=CascadeType.ALL) ④
private Set options = new HashSet();

// 省略 get/setter 方法
}

解 释 :

① 通过 @DiscriminatorValue 将区分字段 TOPIC_TYPE 的值为 2 。由于 PollTopic 实体继承于 Topic 实体,其它的元数据信息直接从 Topic 获得。
④ OneToMany 指定了一个一对多的关联关系, mappedBy 属性指定 “Many” 方类引用 “One” 方类 的属性名; cascade 属性指明了级联方式(如果这里不指定为 CascadeType.ALL 的话,那么有关联关系的两个对象在做保存和删除操作时要分别来进行) 建议 :尽可能使用 cascade=CascadeType.ALL 来减少持久化操作的复杂性和代码量
注意 : JPA 规范规定任何属性都默认映射到表中,所以虽然我们没有给③处的 multiple 属性提供注解信息,但 JPA 将按照 默认的规则对该字段进行映射:字段名和属性名相同,类型相同。如果我们不希望将某个属性持久化到数据表中,则可以通过 @Transient 注解显式指定:
@Transient

private boolean tempProp1;





@Entity(name="T_POLL_OPTION")

Public class PollOption implements Serializable ...{

@Id

@GeneratedValue(strategy = GenerationType.TABLE)

@Column(name = "OPTION_ID")

private int optionId;

@Column(name = "OPTION_ITEM")

private String optionItem;

@ManyToOne ①
@JoinColumn(name="TOPIC_ID", nullable=false) ②
private PollTopic pollTopic;

}



解 释:
① ManyToOne 描述了多对一的关联关系,他是对该类引用的 ”One” 类 (PollTopic) 的属性( pollTopic )进行注解的。
② JoinColumn 指定关联 ”One”(PollTopic) 实体所对应表的 “ 外键 ” 。


Lob 字段的注解:
在 JPA 中 Lob 类型类型的持久化很简单,仅需要通过特殊的 Lob 注解就可以达到目的。
例子:


@Lob ① -1

@Basic(fetch = FetchType.EAGER) ① -2

@Column(name = "POST_TEXT", columnDefinition = "LONGTEXT NOT NULL") ① -3

private String postText;



@Lob

@Basic(fetch = FetchType. LAZY) ② -2

@Column(name = "POST_ATTACH", columnDefinition = "BLOB") ② -3

private byte[] postAttach;



解释:
① -1 JPA 通过 @Lob 将属性标注为 Lob 类型 ;
① -2 通过 @Basic 指定 Lob 类型数据的获取策略, FetchType.EAGER 表示非延迟 加载,而 FetchType. LAZY 表示延迟加载 ;
① -3 通过 @Column 的 columnDefinition 属性指定数据表对应的 Lob 字段类型。






使 用 XML 元数据


除了使用注解提供元数据信息外, JPA 也允许我们通过 XML 提供元数据信息。按照 JPA 的规范, 如果你提供了 XML 元数据描述信息,它将覆盖实体类中的注解元数据信息 。 XML 元数据信息以 orm.xml 命名,放置在类路径的 META-INF 目录下。


<?xml version="1.0" encoding="UTF-8"?>

<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_1_0.xsd"

version="1.0">

①实体对象所在的包
<package>com.baobaotao.domain</package>

<entity class="Topic">

② Topic 实体配置

<table name="T_TOPIC" />

<attributes>

<id name="topicId">

<column name="TOPIC_ID"/>

<generated-value strategy="TABLE" />

</id>

<basic name="topicTitle">

<column name="TOPIC_TITLE" length="30" />

</basic>

<basic name="topicTime">

<column name="TOPIC_TIME" />

<temporal>DATE</temporal>

</basic>

<basic name="topicViews">

<column name="TOPIC_VIEWS" />

</basic>

</attributes>

</entity>

<entity class="PollTopic">

② PollTopic 实体配置

<discriminator-value>2</discriminator-value>

<attributes>

<basic name="maxChoices">

<column name="MAX_CHOICES" />

</basic>

<one-to-many name="options" mapped-by="pollTopic">

<cascade>

<cascade-all/>

</cascade>

</one-to-many>

</attributes>

</entity>

<entity class="PollOption">

② PollOption 实体配置

<table name="T_POLL_OPTION" />

<attributes>

<id name="optionId">

<column name="OPTION_ID" />

<generated-value strategy="TABLE" />

</id>

<basic name="optionItem">

<column name="OPTION_ITEM"/>

</basic>

<many-to-one name="pollTopic" >

<join-column name="TOPIC_ID" nullable="false"/>

</many-to-one>

</attributes>

</entity>

<entity class="Post">

② Post 实体配置

<table name="T_POST" />

<attributes>

<id name="postId">

<column name="POST_ID" />

<generated-value strategy="TABLE" />

</id>

<basic name="postText" fetch="EAGER">

<column name="POST_TEXT" column-definition="LONGTEXT NOT NULL"/>

<lob/>

</basic>

<basic name="postAttach" fetch="LAZY">

<column name="POST_ATTACH" column-definition="BLOB"/>

<lob/>

</basic>

</attributes>

</entity>

</entity-mappings>



使用这个 orm.xml 来描述实体信息的话,这里并没有标明两个继承类之间的关系,其继承信息将从实体类反射信息获取。


到这里我们的实体描述结束 了,当然我们只是做了比较简单的描述,对于那些复杂的信息描述并没有进行讲述。实体描述结束了,有人会问如果我要来操作这些实体该怎么操作?这就是我们接 下来要讲述的问题。


EntityManager 介绍

实体对象由实体管理器进行管理, JPA 使用 javax.persistence.EntityManager 代表实体管理器。实体管理器和持久化上下文关联,持久化上下文是一系列实体的管理环境,我们通过 EntityManager 和持久化上下文进

分享到:
评论

相关推荐

    hibernate基于jpa注解说明[参考].pdf

    hibernate基于jpa注解说明[参考].pdf

    JPA注解说明 详解

    JPA注解 详解 1、@Entity(name="EntityName") 必须,name为可选,对应数据库中一的个表 2、@Table(name="",catalog="",schema="") 可选,通常和@Entity配合使用,只能标注在实体的class定义处,表示实体对应的数据库表...

    JPA注解参考文档

    JPA全称Java Persistence API.JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。 JPA支持XML和JDK5.0注解两种元数据的形式。...这个文档是针对JPA常用注解的一些说明。

    JPA 注解参考文档

    JPA全称Java Persistence API.JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。 JPA支持XML和JDK5.0注解两种元数据的形式。...这个文档是针对JPA常用注解的一些说明。

    JPA注解的解释和说明.pdf

    JPA 的最详细的说明,为你解答每一个注解的使用方法和技巧,帮您快速梳理思路,这是多少个字了????

    JPA标签(注解)详细说明

    JPA (注解标签)参考 相当于帮助文档!

    springmvc4+hibernate4 jpa实现整合(含jar包)

    2.po中的items使用jpa注解。 3.运行测试程序itemtest中的save方法就可以自动创建items表并添加测试数据。 4.ItemsService是Items的相关操作接口,ItemsServerImpl是接口实现,注意jpa注解。 5.ItermController是...

    jpa常用标注

    jpa 基础 常用 标注 注解,一些常用注解 的说明,更好的jpa入门。

    JPA完成单表注解配置说明包括日期,大文本,二进制文本,枚举

    我的应用实例 博文链接:https://zmx.iteye.com/blog/486021

    EJB注解说明

    注解分为两个部分,分别是逻辑映射注解和物理映射注解, 通过逻辑映射注解可以描述对象模型,类之间的关系等等, 而物理映射注解则描述了物理的schema,表,列,索引等等. 下面我们在代码中将混合使用这两种类型的注解

    JPA+批注参考.pdf

    JPA(java persistence api)是JavaEE5.0平台的标准的ORM规范。而Hibernate、TopLink和OpenJPA为JPA的一种实现方式。 本文档主要是对其注解的详细说明。

    JPA2映射的神秘之旅

    JPA2映射的神秘之旅,介绍JPA的标准规范以及注解声明的使用,对已如何做一对多,多对一有详细的说明!

    Hibernate注解

    * @content ejb3注解的API定义在javax.persistence.*包里面。 * * 注释说明: * @Entity —— 将一个类声明为一个实体bean(即一个持久化POJO类) * @Id —— 注解声明了该实体bean的标识属性(对应表中的主键)。 * ...

    Spring高级之注解驱动开发视频教程

    里面包含了JDBC,Data JPA,Data Redis,Data Mongodb,Data Rabbit,Data ElasticSearch等等。合集中的每一项都是针对不同数据存储做的简化封装,使我们在操作不同数据库时,以最简洁的代码完成需求功能。 Spring...

    KanColle-JSON-Data:舰队Collection的JSON格式基础数据

    如果使用Java,可以利用这些类,用JSON序列化库反序列化后,再配合支持JPA注解的ORM框架(例如Hibernate)持久化到数据库。 为了和JSON数据的格式一致,关联字段只声明了关联实体的主键属性,并没有写成嵌套实体类的...

    第二部分、JPA操作多表映射.rar

    Spring MVC全注解实战开发大型商业ERP项目 是java web 开发学习的较好参照,本源码说明共八部分,为持续更新中。本次为第二部分。

    第一部分、JPA简介与基本配置.rar

    Spring MVC全注解实战开发大型商业ERP项目 是java web 开发学习的较好参照,本源码说明共八部分,为持续更新中。本次为第一部分。

    Struts2 + Spring3 + Hibernate3.5 整合(集成测试配套jar包更新构建脚本使用说明)

    本版本全面更新了jar包,全部使用了当前最新版本的jar包,struct2.1.8 spring3 hibernate3.5,全面使用注解取代xm的l配置。 另外增加了一个ant构建脚本,支持使用hudson完成每日构建,持续集成,自动测试,代码规范...

    基于SpringBoot和Vue的餐馆点餐系统源码+数据库+项目说明(毕设).zip

    用三个注解配合Aspect使用 #### IsOwner 标识参数中的UserId是否与当前登录用户一致 #### NeedAdmin 是否需要管理员权限,管理员的type为1,普通用户为0 #### PreAuthorize SpEL表达式,可以自定义自己的权限...

    基于数据库的自动化生成工具,自动生成JavaBean、自动生成数据库文档等(v5.8.0版_JAR)

    于是一怒之下,自己动手丰衣足食,于是就自己用Swing写了一个基于数据库的自动化生成工具,支持MySQL、Oracle、SQLServce、PostgreSQL四种数据库,支持Window、Linux、MacBook等多个作系统,完美支持JPA注解,可以...

Global site tag (gtag.js) - Google Analytics