实体对象以及注解介绍
本文转自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对于开发Java企业级应用至关重要,因为它简化了数据库操作,使得开发者可以更专注于业务逻辑,而不是底层的数据访问细节。同时,了解JPA还可以帮助你更好地理解和使用其他ORM框架,如Hibernate和...
**Java Persistence API (JPA)** 是Java平台上的一个标准,用于管理关系数据库中的数据,它为Java开发者提供了一种对象/...通过学习这些资源,开发者可以更好地理解和运用JPA,提升其在实际项目中的数据库操作能力。
JPA(Java Persistence API)是Java平台上的一个规范,用于管理和持久化Java对象到数据库。它为开发人员提供了一种ORM(Object-Relational Mapping)机制,使得在Java应用中操作数据库变得更加简单。JPA通过元数据...
JPA结合QueryDSL轻松完成复杂查询(自连接,多表连接查询) 参与文档: Pro JPA2中文版:精通Java持久化API 优秀博文读书笔记: http://www.cnblogs.com/sunshine-as-before/tag/java jpa/ 随书pdf文档和源码下载地址: ...
在"JPA快速入门初步(myeclipse)"中,我们将学习如何在MyEclipse中设置JPA项目,理解基本的JPA概念,以及如何使用注解来定义实体和映射数据库表。 1. **JPA基础概念**: - **实体(Entity)**: 表示数据库中的表...
【标题】"spring boot+jpa+redis集群"的实现与应用 在现代互联网开发中,Spring Boot、JPA(Java Persistence API)...通过学习和实践这个项目,开发者可以深入理解这三种技术的协同工作方式,提升自己的技能水平。
**JPA(Java Persistence API)**是Java平台上的一个标准,用于管理关系数据库中的数据,它为应用程序提供了ORM(对象关系...这个"jpaSpring整合demo"就是一个很好的学习资源,可以帮助开发者快速掌握这一整合技术。
它集成了大量常用的第三方库配置,如 JDBC、MongoDB、JPA、RabbitMQ、Quartz 等等,大大减少了开发时的配置工作,使得开发者能够更专注于业务逻辑的实现。 **SpringBoot 核心特性** 1. **起步依赖(Starters)**:...
总之,《JBoss中文文档 CSDN资源下载》是学习和操作JBoss 4.0.x的重要参考资料,无论是初学者还是有经验的开发者,都能从中获益。通过深入学习和实践,可以更好地理解和利用这个强大的Java EE应用服务器。
开发者只需要添加必要的依赖,SpringBoot就能自动配置大部分服务,如数据源、JPA、Tomcat服务器等。这种开箱即用的特性使得开发Spring应用变得非常快捷。 在SpringBoot中,热启动插件(如Spring Loaded或JRebel)...
很多同学都有自己的网盘,方便存储一些java学习教程。该毕业设计实现了一个简易的网盘,包含文件上传和文件分享等功能。 后端技术采用了spring,spring mvc,JPA,前端采用了thymeleaf模板语言。整体业务功能相对...
【Java开发简历管理系统 CSDN下载】是一个基于Java技术栈构建的用于管理个人简历的软件应用。这个系统采用Spring MVC框架进行开发,旨在提供一个高效、便捷的平台,帮助用户存储、管理和分享他们的简历。Spring MVC...
5. **数据访问集成**:Spring提供了对各种数据访问技术的集成,包括JDBC、ORM框架如Hibernate和MyBatis,以及JPA,简化了数据库操作。 6. **MVC框架**:Spring MVC是Spring为构建Web应用程序提供的模块,提供模型-...
数据库层面,你需要熟悉ORM框架(MyBatis、Hibernate、JPA)和连接池(Druid、HikariCP、C3P0),以及分库分表解决方案(MyCat、Sharding-JDBC、Sharding-Sphere)。搜索引擎如ElasticSearch和Solr,以及分布式和...
这个学习笔记的完整教程将涵盖多个关键领域,帮助开发者深入理解和使用 Spring Boot。 1. **Spring Boot 教程** - **基础入门**:了解 Spring Boot 的核心理念,包括自动配置、起步依赖和独立运行的特性。 - **...
SpringBoot入门学习主要涵盖SpringBoot的基本概念、核心特性以及如何快速搭建一个运行的Web应用。SpringBoot是由Pivotal团队提供的全新框架,旨在简化Spring应用的初始搭建以及开发过程。它集成了大量的常用第三方库...
使用maven管理,基于spring boot开发,数据库使用的mysql,对数据操作使用的是spring boot jpa,页面使用的是thymeleaf模板引擎,并用spring-boot-devtools做了热部署,项目中做了开发文档(和参考微信公众平台应用...
这个源码提供了深入理解Java编程语言以及实际项目开发的机会,对于初学者和有经验的开发者来说,都是一个很好的学习资源。下面我们将详细探讨这个系统的一些关键知识点。 1. **MVC设计模式**:在大多数Java Web应用...
它集成了大量常用的第三方库配置,如数据源、JPA、MVC、security等,使得开发者可以“零配置”快速启动项目。SpringBoot的核心理念是“约定优于配置”,它通过默认配置来减少项目的初始化工作,同时也提供了丰富的...
前后端分离(后台)该项目使用了lombok,如果使用idea记得装lombok插件,推荐使用idea导入项目 这是后台(数据库有更改)建议配合idea的数据库插件使用非常方便 不用建表,启动项目即可,jpa会自动将实体类映射成表,...