使用注解元数据
基本注解:
例子:
@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 和持久化上下文进
分享到:
相关推荐
Java 程序使用 JPA 注解详解 Java 持久层 API(Java Persistence API)是一种 Java 应用程序接口,用于访问、管理和持久化数据之间的关系。JPA 使用注解来定义实体类与数据库表之间的映射关系,本文将详细介绍 JPA ...
### JPA注解总结大全 Java Persistence API (JPA) 是一种用于管理关系数据库中的对象/关系映射的标准。本文将详细介绍与 JPA 相关的一些常用注解及其使用方法,帮助开发者更好地理解和掌握 JPA 的核心功能。 #### ...
JPA全称Java Persistence API.JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。 JPA支持XML和JDK5.0注解两种元数据的形式。 JPA的总体思想和现有Hibernate、TopLink、...
#### 使用JPA注解实现联合主键 在JPA中,我们可以通过`@IdClass`和`@Id`注解来实现联合主键。下面将详细介绍如何通过这些注解来实现联合主键。 ### 创建复合主键类 首先,需要创建一个复合主键类来存储需要组成...
JPA全称Java Persistence API.JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。 JPA支持XML和JDK5.0注解两种元数据的形式。 JPA的总体思想和现有Hibernate、TopLink、...
JPA注解详解 JPA(Java Persistence API)是Java企业版5(Java EE 5)的一部分,提供了一个对象关系映射方法,使得开发者可以使用声明方式定义如何将Java对象映射到关系数据库表。在JPA中,批注是一种使用元数据...
### JPA注解参考知识点详解 #### 一、引言 Java Persistence API(简称JPA)作为Java企业版5(Java EE 5)标准的一部分,是Enterprise JavaBeans(EJB)3.0规范的重要组成部分。它极大地简化了EJB持久化,并提供了...
Java 程序使用 JPA 注解详解 Java 程序使用 JPA 注解可以实现对象关系映射(ORM),使得 Java 应用程序能够与关系数据库进行交互。JPA(Java Persistence API)提供了多种注解来定义实体类与数据库表之间的映射关系...
在SpringMVC中集成JPA,通常会使用Spring Data JPA,它提供了基于方法的声明式查询,通过接口方法名即可生成对应的SQL。比如,`findAll()`对应`SELECT * FROM table`,`findByXXX()`对应带有条件的查询。此外,`@...
2. **注解使用错误**:你可能在实体类中错误地使用了`@Table.indexes()`,没有正确地创建`@Index`注解实例。正确的使用方式是定义一个`@Table`注解,并在其中使用`indexes`属性来指定索引。 ```java @Entity @...
Spring Data JPA是Spring的一个模块,它简化了使用JPA进行数据访问的操作。Spring Data JPA提供了强大的Repository抽象,允许开发者以声明式的方式定义数据操作,如查询方法。只需要在接口上定义方法名,Spring Data...
**JPA注解@Access详解** Java Persistence API (JPA) 是Java中用于对象关系映射(ORM)的标准框架,它允许开发人员将Java类与数据库表进行映射,从而简化数据操作。在JPA中,`@Access`注解是用于指定实体属性访问...
Hibernate之JPA注解
JPA注解和Hibernate建表 一、JPA概述 Java Persistence API(JPA)是Sun官方提出的Java持久化规范,它只是一个规范不是一个产品。JPA的主要目标是提供一种简洁、易用的方式来访问、操作和管理Java应用程序中的数据...
在实际开发中,JPA已经发展了许多新特性,比如Spring Data JPA的Repository抽象,以及更现代的ORM框架如Hibernate,它们在注解使用和功能上可能会有所不同,但基础概念是相通的。学习并熟练掌握这些注解,将有助于...
Jpa注解的各种jpa注释详解
JPA注解参考_Oracle.chm 通过它可以全面的掌握JPA编程
最后,文中还介绍了SpringBoot框架中的注解使用方法: @SpringBootApplication:通常用于主类上,包含@Configuration、@EnableAutoConfiguration、@ComponentScan注解,用于开启Spring Boot应用的自动配置。 @...
JPA通过使用注解或XML来定义对象-关系映射(ORM),简化了数据库操作。下面将详细介绍JPA中的一些核心注解及其用法。 1. **@Entity(name="EntityName")**:此注解标记一个Java类为一个实体类,它对应数据库中的一个...