`
Cavalier520520
  • 浏览: 9984 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

JPA注解的使用

阅读更多

使用注解元数据
基本注解:
例子:
@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程序使用JPA注解详解 JPA注解详解 java 程序使用 JPA注解 详解

    JPA注解总结大全!!!!

    详细的JPA注解总结大全 ,,,,,,,

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

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

    JPA注解参考文档

    JPA全称Java Persistence API.JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。 JPA支持XML和JDK5.0注解两种元数据的形式。 JPA的总体思想和现有Hibernate、TopLink、...

    JPA注解.doc J PA注解.

    JPA注解.doc JPA注解.doc JPA注解.doc JPA注解.doc JPA注解.doc JPA注解.doc JPA注解.doc JPA注解.doc JPA注解.doc JPA注解.doc JPA注解.doc JPA注解.doc JPA注解.doc JPA注解.doc JPA注解.doc JPA注解.doc JPA注解....

    JPA 注解参考文档

    JPA全称Java Persistence API.JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。 JPA支持XML和JDK5.0注解两种元数据的形式。 JPA的总体思想和现有Hibernate、TopLink、...

    SpringMVC+JPA 注解开发 maven

    使用springMVC结合JPA 采用注解开发框架搭建 有简单的登录 以及spring 拦截器的使用 配置代码都有详细注释 方便学习

    JPA注解@Access实例

    JPA注解@Access实例 test-jpa

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

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

    Hibernate使用JPA注解代码

    Hibernate5.1.fianl整合JPA注解方式异常:persistence.Table.indexes()[Ljavax/persistence/Index;

    Hibernate之JPA注解

    Hibernate之JPA注解

    JPA注解参考文档.txt

    作. Java 企.版 5 (Java EE 5) ...使用 JPA .,可以使用批注配置.体的 JPA 行.。批注是一种使用元.据修. Java 源代.的..表. 方法,它...相.的 Java .文件,以便在.行.由 JPA 持.性提供程序解.以管理 JPA 行.。

    JPA注解实现联合主键

    本文档简单描述了注解实现联合主键类的生成

    Hibernate+JPA注解教程.doc

    Hibernate+JPA注解教程.docHibernate+JPA注解教程.docHibernate+JPA注解教程.docHibernate+JPA注解教程.doc

    Hibernate开发讲义JPA注解

    Hibernate开发讲义JPA注解.ppt

    jpa注解详解

    java开发的JPA 批注总结参考资料,内容非常详细,非常丰富。

    jpa注解doc文档

    Jpa注解的各种jpa注释详解

    JPA注解 和hibernate 建表

    JPA注解创建数据库表 和hibernate.cfg.xml 建表

    JPA注解说明 详解

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

    spring注解+spring data jpa文档+JPA文档.rar

    spring注解完整版+spring data jpa官方文档中文翻译+JPA2.0官方文档 文档内容齐全 值得参考学习

Global site tag (gtag.js) - Google Analytics