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

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 和持久化上下文进

分享到:
评论

相关推荐

    JPA注解说明 详解

    JPA通过使用注解或XML来定义对象-关系映射(ORM),简化了数据库操作。下面将详细介绍JPA中的一些核心注解及其用法。 1. **@Entity(name="EntityName")**:此注解标记一个Java类为一个实体类,它对应数据库中的一个...

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

    本篇文章将详细解释在Hibernate中基于JPA注解的使用方法。 1. **@Entity(name="EntityName")**:这个注解用于声明一个Java类作为数据库中的实体,"EntityName"是可选的,如果不指定,那么实体的名称默认为类名。每...

    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常用注解的一些说明。

    java程序使用JPA注解详解.doc

    Java 程序使用 JPA 注解详解 Java 持久层 API(Java Persistence API)是一种 Java 应用程序接口,用于访问、管理和持久化数据之间的关系。JPA 使用注解来定义实体类与数据库表之间的映射关系,本文将详细介绍 JPA ...

    JPA注解的解释和说明.pdf

    本文将详细介绍JPA中常用注解的使用方法和技巧。 @Entity:此注解用于声明一个类是实体类,并且该类中的对象会被映射到数据库表。实体类通常需要使用@Table注解来指定具体的数据库表名称。当实体类的名称和数据库表...

    JPA注解(转)

    **JPA注解详解** Java Persistence API(JPA)是Java平台上的一个标准,用于管理关系数据库中的数据。它提供了一种对象/关系映射(ORM)机制,使得开发人员可以使用面向对象的编程方式来操作数据库。在JPA中,注解...

    JPA中文解释,JPA的API

    标签中提到了"JPA注解参考_Oracle",这暗示了文件可能包含有关如何在JPA中使用注解来配置实体类以及在Oracle数据库上运行的相关信息。在JPA中,注解如`@Entity`用于标记实体类,`@Table`指定对应的数据库表,`@Id`...

    JPA注解教程

    ### JPA注解教程 #### 一、JPA与实体持久化 Java Persistence API (JPA) 是一种用于管理关系型数据库中数据的标准规范。它允许开发者以面向对象的方式操作数据库,无需直接编写SQL语句。JPA的核心是实体管理和查询...

    JPA标签(注解)详细说明

    在JPA中,注解(也称为标签)起着至关重要的作用,它们提供了声明式的方式来配置实体类,使得这些类能够被持久化到数据库中。 1. **实体**: - `@Entity`:这个注解标记一个Java类为一个JPA实体,意味着这个类的...

    jpa使用说明(English)

    ### JPA 使用说明 #### 一、引言与背景 在企业级应用开发中,管理关系型数据库的数据是一项核心任务。传统的做法是使用 JDBC(Java Database Connectivity)来操作数据库。虽然 JDBC 支持大量数据的处理,能确保...

    JPA框架新技术: 注解

    要使用JPA注解,首先需要在项目中添加相应的依赖库,如`ejb3-persistence.jar`等。 #### 三、常用JPA注解详解 1. **@Entity** - 该注解用于标记一个Java类为实体类,表明它可以被JPA持久化。例如: ```java @...

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

    我们将通过具体的例子来说明这些概念,并参考一个名为“JPA_Dome”的压缩包文件中的示例代码。 首先,我们需要引入JPA的依赖,如Spring Data JPA,它为Spring应用提供了与JPA的集成。在Maven的pom.xml文件中,你...

    JPA标注说明文档(带文档结构整理)

    **JPA注解分类与说明** 1. **实体注解 (@Entity)**: - `@Entity`标记一个Java类为JPA实体,这意味着这个类的实例将被持久化到数据库中。默认情况下,实体类名对应数据库表名,字段对应列名。 2. **数据库模式属性...

    jpa/hibernate继承注解

    以下是对"jpa/hibernate继承注解"这一主题的详细说明。 1. **单一表继承(Single Table Inheritance, STI)** 单一表继承是最简单的继承策略,所有的子类信息都存储在一个数据库表中。使用`@Inheritance(strategy ...

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

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

    Java Persistence API(EJB3.0中的 JPA 规范说明)

    ### Java Persistence API (EJB 3.0 中的 JPA 规范说明) #### 引言 Java Persistence API(简称 JPA)是 Java 社区规范 JSR 220 的一部分,它定义了一种对象关系映射工具的标准,允许 Java 开发人员将 Java 应用...

    hibernate注解说明文档

    以下是对 Hibernate 注解的详细说明: 1. **@Entity**:这个注解用于标记一个 Java 类为实体类,意味着这个类的实例将被持久化到数据库中。一个实体类通常代表数据库中的一个表。 2. **@Id**:这个注解标记实体类...

    注解(最全最详细的注解描述).zip

    - **资源管理**:比如在JPA中,@Transactional注解用于标记一个方法或类,表明该方法需要在事务中执行。 - **配置**:例如Spring的@Configuration和@Bean注解,用于声明配置类和配置方法。 6. **注解的实战应用**...

    spring3.0.5与JPA2.0(hibernate3.6)的集成详细说明

    3. **实体类**:编写表示数据库表的Java类,并使用JPA注解如@Entity、@Table、@Id等进行映射。 4. **持久化配置**:创建一个名为`persistence.xml`的文件,配置数据源、实体扫描路径、JPA供应商(这里是Hibernate)...

Global site tag (gtag.js) - Google Analytics