`
nishifei
  • 浏览: 15142 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Jpa 的 学习 转自CSDN

阅读更多

实体对象以及注解介绍

本文转自Csdn。读本文请先为这哥们祈福!

参考网址:http://blog.csdn.net/songjie521/archive/2008/09/16/2937238.aspx

 

具有 ORM 元数据的领域对象称为实体( Entity ),按 JPA 的规范,实体具备以下的条件:

必须使用 javax.persistence.Entity 注解或者在 XML 映射文件中有对应的元素;

必须具有一个不带参的构造函数,类不能声明为 final ,方法和需要持久化的属性也不能声明为 final

如果游离状的实体对象需要以值的方式进行传递,如通 Session bean 的远程业务接口传递,则必须实现 Serializable 接口;

需要持久化的属性,其访问修饰符不能是 public ,它们必须通过实体类方法进行访问。

 

使用注解元数据

基本注解:

例子:

@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 和持久化上下文进行交互。

 

有两种类型的实体管理器:

容器型:容器型的实体管理器由容器负责实体管理器之间的协作,在一个 JTA 事务中,一个实体管理器的持久化上下文的状态会自动广播到所有使用 EntityManager 的应用程序组件中。 Java EE 应用服务器提供的就是管理型的实体管理器;

应用程序型:实体管理器的生命周期由应用程序控制,应用程序通过 javax.persistence.EntityManagerFactory createEntityManager 创建 EntityManager 实例。

 

EntityManager 的创建过程图:

 

 

我们在程序中的创建 EntityManager 的代码:

EntityManagerFactory currentManagerFactory = Persistence.createEntityManagerFactory(persistenceUtilName); </

分享到:
评论

相关推荐

    jpa例子jpajpa

    学习和掌握JPA对于开发Java企业级应用至关重要,因为它简化了数据库操作,使得开发者可以更专注于业务逻辑,而不是底层的数据访问细节。同时,了解JPA还可以帮助你更好地理解和使用其他ORM框架,如Hibernate和...

    JPA讲解视频

    **Java Persistence API (JPA)** 是Java平台上的一个标准,用于管理关系数据库中的数据,它为Java开发者提供了一种对象/...通过学习这些资源,开发者可以更好地理解和运用JPA,提升其在实际项目中的数据库操作能力。

    JPA学习笔记(高手笔记录)

    JPA(Java Persistence API)是Java平台上的一个规范,用于管理和持久化Java对象到数据库。它为开发人员提供了一种ORM(Object-Relational Mapping)机制,使得在Java应用中操作数据库变得更加简单。JPA通过元数据...

    优秀实践分享 Spring Data JPA2

    JPA结合QueryDSL轻松完成复杂查询(自连接,多表连接查询) 参与文档: Pro JPA2中文版:精通Java持久化API 优秀博文读书笔记: http://www.cnblogs.com/sunshine-as-before/tag/java jpa/ 随书pdf文档和源码下载地址: ...

    JPA快速入门初步(myeclipse)

    在"JPA快速入门初步(myeclipse)"中,我们将学习如何在MyEclipse中设置JPA项目,理解基本的JPA概念,以及如何使用注解来定义实体和映射数据库表。 1. **JPA基础概念**: - **实体(Entity)**: 表示数据库中的表...

    spring boot+jpa+redis集群

    【标题】"spring boot+jpa+redis集群"的实现与应用 在现代互联网开发中,Spring Boot、JPA(Java Persistence API)...通过学习和实践这个项目,开发者可以深入理解这三种技术的协同工作方式,提升自己的技能水平。

    jpaSpring整合demo

    **JPA(Java Persistence API)**是Java平台上的一个标准,用于管理关系数据库中的数据,它为应用程序提供了ORM(对象关系...这个"jpaSpring整合demo"就是一个很好的学习资源,可以帮助开发者快速掌握这一整合技术。

    springboot快速学习项目

    它集成了大量常用的第三方库配置,如 JDBC、MongoDB、JPA、RabbitMQ、Quartz 等等,大大减少了开发时的配置工作,使得开发者能够更专注于业务逻辑的实现。 **SpringBoot 核心特性** 1. **起步依赖(Starters)**:...

    JBOSS中文文档 CSDN资源下载

    总之,《JBoss中文文档 CSDN资源下载》是学习和操作JBoss 4.0.x的重要参考资料,无论是初学者还是有经验的开发者,都能从中获益。通过深入学习和实践,可以更好地理解和利用这个强大的Java EE应用服务器。

    springboot学习资源

    开发者只需要添加必要的依赖,SpringBoot就能自动配置大部分服务,如数据源、JPA、Tomcat服务器等。这种开箱即用的特性使得开发Spring应用变得非常快捷。 在SpringBoot中,热启动插件(如Spring Loaded或JRebel)...

    Java项目:网盘系统设计和实现(java+ssm+jpa)源码

    很多同学都有自己的网盘,方便存储一些java学习教程。该毕业设计实现了一个简易的网盘,包含文件上传和文件分享等功能。 后端技术采用了spring,spring mvc,JPA,前端采用了thymeleaf模板语言。整体业务功能相对...

    Java开发简历管理系统 CSDN下载

    【Java开发简历管理系统 CSDN下载】是一个基于Java技术栈构建的用于管理个人简历的软件应用。这个系统采用Spring MVC框架进行开发,旨在提供一个高效、便捷的平台,帮助用户存储、管理和分享他们的简历。Spring MVC...

    spring学习

    5. **数据访问集成**:Spring提供了对各种数据访问技术的集成,包括JDBC、ORM框架如Hibernate和MyBatis,以及JPA,简化了数据库操作。 6. **MVC框架**:Spring MVC是Spring为构建Web应用程序提供的模块,提供模型-...

    Java后端学习路线梳理(csdn)————程序.pdf

    数据库层面,你需要熟悉ORM框架(MyBatis、Hibernate、JPA)和连接池(Druid、HikariCP、C3P0),以及分库分表解决方案(MyCat、Sharding-JDBC、Sharding-Sphere)。搜索引擎如ElasticSearch和Solr,以及分布式和...

    Spring Boot 学习笔记完整教程.docx

    这个学习笔记的完整教程将涵盖多个关键领域,帮助开发者深入理解和使用 Spring Boot。 1. **Spring Boot 教程** - **基础入门**:了解 Spring Boot 的核心理念,包括自动配置、起步依赖和独立运行的特性。 - **...

    SpringBoot入门学习

    SpringBoot入门学习主要涵盖SpringBoot的基本概念、核心特性以及如何快速搭建一个运行的Web应用。SpringBoot是由Pivotal团队提供的全新框架,旨在简化Spring应用的初始搭建以及开发过程。它集成了大量的常用第三方库...

    微信公众号开发学习

    使用maven管理,基于spring boot开发,数据库使用的mysql,对数据操作使用的是spring boot jpa,页面使用的是thymeleaf模板引擎,并用spring-boot-devtools做了热部署,项目中做了开发文档(和参考微信公众平台应用...

    java学生查询系统源码

    这个源码提供了深入理解Java编程语言以及实际项目开发的机会,对于初学者和有经验的开发者来说,都是一个很好的学习资源。下面我们将详细探讨这个系统的一些关键知识点。 1. **MVC设计模式**:在大多数Java Web应用...

    SpringBoot

    它集成了大量常用的第三方库配置,如数据源、JPA、MVC、security等,使得开发者可以“零配置”快速启动项目。SpringBoot的核心理念是“约定优于配置”,它通过默认配置来减少项目的初始化工作,同时也提供了丰富的...

    基于springboot+vue实现前后端分离的大学校园论坛项目源码+数据库+项目说明.zip

    前后端分离(后台)该项目使用了lombok,如果使用idea记得装lombok插件,推荐使用idea导入项目 这是后台(数据库有更改)建议配合idea的数据库插件使用非常方便 不用建表,启动项目即可,jpa会自动将实体类映射成表,...

Global site tag (gtag.js) - Google Analytics