JPA_Basic
JPA设置默认字段及其长度详解

JPA设置默认字段及其长度详解⽬录String定义 Integer 和 Long 有区别吗定义Integer和int有区别吗boolean类型⽇期浮点数格式的设置⼤⽂本使⽤jpa去⽣成对应的值的长度和默认值是如何设置的呢@Target({ElementType.METHOD, ElementType.FIELD})@Retention(RetentionPolicy.RUNTIME)public @interface Column {String name() default "";boolean unique() default false;boolean nullable() default true;boolean insertable() default true;boolean updatable() default true;String columnDefinition() default "";String table() default "";int length() default 255;int precision() default 0;int scale() default 0;}name 属性⽤来设置字段的名字unique⽤于设置这个字段是否是是唯⼀的insertable和updatable、table都是和表更新相关的操作,length 指定长度,默认是255precision 数据长度scale⼩数的长度columnDefinition 指定这⼀列的信息Stringstring是最常见的字段,@Column(name = “name”)private String name;SQL中 name varchar(255)⽣成的字段长度为255,即如果不设置长度的话默认的长度就是255个。
@Column(name = “name”,length = 50)private String name;name varchar(50)@Column(name = “name”,columnDefinition=“varchar(11) COMMENT ‘⽤户姓名'”)private String name;name varchar(11) COMMENT ‘⽤户姓名'这⾥不仅指定了长度,还给列了⼀个注释,便于查看@Column(name = “name”,columnDefinition=“default ‘12345'”)private String name;如果我们制定默认值,这样SQL语句就会报错create table user (id bigint not null, age integer, birth datetime(6), name default ‘12345', sex bit, primary key (id)) engine=InnoDB如果我们制定长度呢@Column(name = “name”,columnDefinition=“default ‘12345'”,length = 25)private String name;运⾏的DDL语句依然⽆法创建出表create table user (id bigint not null, age integer, birth datetime(6), name default ‘12345', sex bit, primary key (id)) engine=InnoDB如何给String字段指定默认值呢所以如果指定columnDefinition这个属性会覆盖原来的列注解的长度,⽽且在其注解的中必须制定列的类型/*** (Optional) The SQL fragment that is used when* generating the DDL for the column.* <p> Defaults to the generated SQL to create a* column of the inferred type.*/String columnDefinition() default "";/***(可选)在以下情况下使⽤的SQL⽚段:*正在为列⽣成DDL。
jpa baseentity 最佳实践

jpa baseentity 最佳实践在使用 JPA(Java Persistence API)进行数据持久化时,BaseEntity 是一个常见的实体类,通常用于封装实体类的一些共用属性和方法。
BaseEntity 包含了一些常见的属性,例如 id、createAt 和 updateAt,以及一些常见的方法,例如获取/设置这些属性的方法。
在本文中,我们将探讨 JPA BaseEntity 的最佳实践。
1. BaseEntity 类的设计设计 BaseEntity 类时需要考虑以下几个方面:1.1. 声明实体类的共用属性BaseEntity 类一般包含实体类的共用属性,最基本的属性是 id,用于标识实体的唯一性。
此外,常见的属性还包括 createAt(用于记录实体创建时间)和updateAt(用于记录实体更新时间)。
1.2. 提供默认的构造方法在 BaseEntity 类中,最好提供一个默认的无参构造方法。
这样可以在实例化子实体类时,通过调用父类的构造方法,自动初始化 BaseEntity 中的共用属性。
1.3. 考虑添加其他通用属性除了 id、createAt 和 updateAt 属性之外,根据需求,还可以考虑添加其他通用属性,例如逻辑删除标记、创建者和修改者等。
这些属性的添加应根据实际业务需求,避免过度设计。
2. 实现 BaseEntity 类实现 BaseEntity 类时,应注意以下几点:2.1. 定义属性和对应的访问方法在 BaseEntity 类中,应定义 id、createAt 和 updateAt 属性,并为它们提供相应的访问方法。
这些方法通常是公开的,供子类继承和使用。
2.2. 使用 JPA 注解若 BaseEntity 类需要被持久化存储,需要使用 JPA 注解指定表名、字段名和关联关系等元数据信息。
根据实际需求,可以使用 @Entity、@Table 和 @Column 等注解。
基于JPA中的@Basic注解详解

基于JPA中的@Basic注解详解今天我们来聊聊JPA @Basic注解的使⽤1.介绍:@Basic 是实体类与数据库字段映射时最简单的类型。
在该注解的介绍中:The <code>Basic</code> annotation can be applied to a persistent* property or instance variable of any of the following types: Java* primitive types, wrappers of the primitive types, <code>String</code>,* <code>java.math.BigInteger</code>,* <code>java.math.BigDecimal</code>,* <code>java.util.Date</code>,* <code>java.util.Calendar</code>,* <code>java.sql.Date</code>,* <code>java.sql.Time</code>,* <code>java.sql.Timestamp</code>, <code>byte[]</code>, <code>Byte[]</code>,* <code>char[]</code>, <code>Character[]</code>, enums, and any other type that* implements <code>java.io.Serializable</code>我们可以看到,它可以⽤于持久类属性或实例变量(instance variable)上,类型包含java基本类型(byte,short,int,long,float,double,char,boolean),包装类,枚举类,以及实现了Serializable接⼝的类型。
JPA 批注参考

JPA 批注参考(1)2008年05月29日星期四 10:28来源:■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■JPA批注是EJB 3标准的一部分,用于为ORM框架提供基于批注的配置方式,但是JPA本身是独立于EJB 3的,可被任何的ORM框架使用。
本文的主要内容如下:1、按照类别对JPA批注进行划分,划分为11个类别,各个类别及其可以使用的批注(括号内即为可以使用的批注)如下:⑴ 实体(@Entity)⑵ 数据库模式属性(@Table、@SecondaryTable、@SecondaryTables、@Column、@JoinColumn、@JoinColumns、@PrimaryKeyJoinColumn、@PrimaryKeyJoinColumns、@JoinTable、@UniqueConstraint)⑶ 身份(@Id、@IdClass、@EmbeddedId、@GeneratedValue、@SequenceGenerator、@TableGenerator)⑷ 直接映射( @Basic、@Enumerated、@Temporal、@Lob、@Transient)⑸ 关系映射(@OneToOne、@ManyToOne、@OneToMany、@ManyToMany、@MapKey、@OrderBy)⑹ 组合(@Embeddable、@Embedded、@AttributeOverride、@AttributeOverrides、@AssociationOverride、@AssociationOverrides)⑺ 继承(@Inheritance、@DiscriminatorColumn、@DiscriminatorValue、@MappedSuperclass、@AssociationOverride、@AssociationOverrides、@AttributeOverride、@AttributeOverrides)⑻ 锁定(@Version)⑼ 生命周期回调事件(@PrePersist、@PostPersist、@PreRemove、@PostRemove、@PreUpdate、@PostUpdate、@PostLoad、@EntityListeners、@ExcludeDefaultListeners、@ExcludeSuperclassListeners)⑽ 实体管理器(@PersistenceUnit、@PersistenceUnits、@PersistenceContext、@PersistenceContexts、@PersistenceProperty)⑾ 查询(@NamedQuery、@NamedQueries、@NamedNativeQuery、@NamedNativeQueries、@QueryHint、@ColumnResult、@EntityResult、@FieldResult、@SqlResultSetMapping、@SqlResultSetMappings)2、详细解释了下面4个批注的含义及其批注所包含的属性:@AssociationOverride@AssociationOverrides@AttributeOverride@AttributeOverrides注意:原文有错误的之处已经在这里全部更正。
jpa 用法

jpa 用法
JPA(Java Persistence API)是一种Java标准,用于将Java 对象与关系数据库进行映射。
下面是JPA的基本用法:
1.添加依赖:首先,需要在项目中添加JPA的依赖。
常见的做法是使用Maven或Gradle等构建工具,将相关的JAR 包添加到项目中。
2.配置数据源:在项目中配置数据源,包括数据库连接信息、用户名和密码等。
这通常在项目的配置文件中完成。
3.创建实体类:根据数据库表的结构,创建对应的Java 实体类。
每个实体类通常对应一个数据库表,实体类中的属性与表中的列一一对应。
4.配置实体管理器:使用实体管理器来管理实体类的生命周期,包括实体的创建、查询、更新和删除等操作。
5.查询数据:使用JPQL(Java Persistence Query Language)或SQL查询数据。
JPQL是一种类似于SQL的查询语言,专门用于查询实体类和关联数据。
6.处理结果:查询结果通常返回一个实体类的列表或单个实体对象。
可以根据需要对结果进行处理,例如将数据展示在前端页面上。
7.事务管理:在执行数据增删改查等操作时,需要进行事务管理。
JPA支持声明式事务管理,可以通过注解或XML
配置来指定事务的边界。
以上是JPA的基本用法,具体的实现方式可能因不同的框架和环境而有所差异。
SpringDataJPA在Entity中常用的注解浅析

SpringDataJPA在Entity中常⽤的注解浅析 ⾸先我们常⽤的注解包括(@Entity、@Table、@Id、@IdClass、@GeneratedValue、@Basic、@Transient、@Column、@Temporal、@Enumerated、@Lob)1. @Entity使⽤此注解定义的对象将会成为被JPA管理的实体,将映射到指定的数据库表@Entity(name = "user")其中name默认是此实体类的名字,全局唯⼀。
2. @Table指定此实体类对应的数据库的表名。
若注解不加名字则系统认为表名和实体类的名字相同3. @Id定义字段为数据库的主键,⼀个实体⾥⾯必须有⼀个。
4. @IdClass利⽤外部类的联合主键,其中外部类必须满⾜⼀下⼏点要求必须实现Serializable接⼝。
必须有默认的public⽆参数的构造⽅法。
必须覆盖equals和hashCode⽅法。
equals⽅法⽤于判断两个对象是否相同,EntityManger通过find⽅法来查找Entity时是根据equals的返回值来判断的。
hashCode⽅法返回当前对象的哈希码,⽣成的hashCode相同的概率越⼩越好,算法可以进⾏优化。
5. @GeneratedValue为主键⽣成策略默认为AUTO即JPA⾃动选择合适的策略IDENTITY 适⽤于MySQL,策略为⾃增SEQUENCE 通过序列⽣成主键通过@SquenceGenerator指定序列名MySQL不⽀持TABLE 框架由表模拟产⽣主键,使⽤该策略有利于数据库移植6. @Basic表⽰此字段是映射到数据库,如果实体字段上没有任何注解默认为@Basic。
其中可选参数为@Basic(fetch = ZY, optional = false)其中fetch默认为EAGER⽴即加载,LAZY为延迟加载、optional表⽰该字段是否可以为null7. @Transient和@Basic的作⽤相反,表⽰该字段不是⼀个到数据库表的字段映射,JPA映射数据库的时候忽略此字段。
jpa命名规则

jpa命名规则JavaPersistenceAPI(JPA)是JavaEE平台提供的数据库持久化技术。
它通过定义一套灵活、通用的持久性规范,可以让开发人员使用它来管理持久化数据。
在使用JPA进行数据持久化时,要遵守JPA 的命名规则,这些命名规则是持久化操作的基础。
首先,JPA的命名规则规定了数据库表和字段的命名格式。
在JPA 规范中,表的命名规则要求使用大写字母加下划线的格式,例如:USER_INFO,字段必须以小写字母开始,每个单词之间使用下划线分隔,例如:user_name。
其次,JPA还规定了实体类的命名规则。
在JPA中,实体类应该以一般的单词作为名称,使用驼峰命名规则,首字母应该大写,每个单词的首字母应该大写,例如:UserInfo。
还有,JPA规定实体类中的属性也要遵循特定的命名规则,属性的名称也应该使用驼峰命名法,属性的第一个字母应该小写,每个单词的首字母应该大写,例如:userName。
此外,JPA还是规定一些其它的字段命名规则,例如,主键字段应该以id或者ID开头,外键字段应该以外键名称开头,例如:userId;外键字段的类型应该定义为外键引用的实体类的类型,而不是其他类型;字段的命名应该有语义,而不是使用乱七八糟的字符。
最后,JPA还规定了实体类和其他类之间映射关系的命名规则。
在JPA中,实体类之间映射关系具有一定的规律性,通常情况下,一个实体类名称加一个`s`就可以得到它与另一个实体类之间映射关系的名称,例如:user_info表与user_role表之间的映射关系名称为usersRoles。
以上就是JPA的命名规则,遵循这些规则可以有效地管理数据库中的数据,从而使程序的代码更加简洁、清晰,而且易于维护和管理。
JPA常用注解

(1)Entity@javax.persistence.Entity(name="xxx")name指定实体Bean的名称,默认值为bean class 的非限定类名(不带包的短类名)(2)Table@javax.persistence.Table(catalog="xx",name="xx",schema="xx",uniqueConstraints={ @ UniqueConstraint(columnNames={"xx","xx"})})name:指定表的名称catalog:指定数据库名称schema:指定数据库的用户名uniqueConstraints:指定唯一性字段约束(字段值唯一不重复)如为personid和name 字段指定唯一性约束:uniqueConstraints={ @UniqueConstraint(columnNames={"personid", "name"})}(3)Id@javax.persistence.Id()映射到数据库表的主键的属性,一个实体只能有一个属性被映射为主键.(4)GeneratedValue@javax.persistence.GeneratedValue(generator="xxx",strategy=GenerationType.AUTO) strategy:表示主键生成策略,有方式一:@GeneratedValue(strategy=GenerationType.AUTO) 默认策略,生成方式取决于底层的数据库。
方式二:@GeneratedValue(strategy = GenerationType.IDENTITY)指定“自动增长”策略,适用于MySQL。
java basic 认证方式

在编程领域中,Java是一种非常流行和强大的编程语言,它被广泛应用于企业级应用程序开发和互联网应用开发中。
在Java开发中,安全认证方式是非常重要的一部分,它保障了系统的安全性和用户的隐私。
在本文中,我们将讨论Java中的基本认证方式,探讨其深度和广度,以便全面理解和灵活应用于实际开发中。
1. 什么是基本认证方式?在Java中,基本认证方式是一种最简单的认证方式。
它通过在HTTP请求头中加入用户名和密码的明文形式来验证用户的身份。
这种认证方式虽然简单,但是安全性较低,因为用户名和密码都是以明文形式传输,容易被窃取。
在实际开发中,基本认证方式通常用于内部网络或做一些简单的演示或测试。
2. 基本认证方式的步骤基本认证方式的步骤非常简单,可以分为以下几步:(1)客户端向服务器发起请求;(2)服务器返回401未授权状态码;(3)客户端收到401状态码后,弹出一个对话框,要求用户输入用户名和密码;(4)客户端将用户名和密码经过Base64编码后,放在请求头Authorization字段中发送给服务器;(5)服务器验证用户名和密码是否正确,如果正确,则返回相应的资源,否则返回401状态码。
3. 如何在Java中实现基本认证方式?在Java中实现基本认证方式非常简单,可以利用HttpURLConnection或者HttpClient来完成。
下面以HttpURLConnection为例,演示如何在Java中实现基本认证方式:```javaURL url = new URL("");HttpURLConnection connection = (HttpURLConnection)url.openConnection();String userCredentials = "username:password";String basicAuth = "Basic " + newString(Base64.getEncoder().encode(userCredentials.getBytes())); connection.setRequestProperty("Authorization", basicAuth);```4. 我对基本认证方式的个人观点和理解基本认证方式虽然简单,但是安全性较低,容易受到中间人攻击。
JPA_官方文档

@GeneratedValue:主键的产生策略,通过 strategy 属性指定。默认情况下,JPA 自 动选择一个最适合底层数据库的主键生成策略,如 SqlServer 对应 identity,MySql 对应 auto increment。在 javax.persistence.GenerationType 中定义了以下几种可供选 择的策略:
JOINED:父子类相同的部分保存在同一个表中,不同的部分分开存放,通过表连 接获取完整数据;
TABLE_PER_CLASS:每一个类对应自己的表,一般不推荐采用这种方式。
关联关系
我们再继续对 PollTopic 进行注解,进一步了解实体继承的 JPA 映射定义:
代码清单 3:PollTopic 映射描述
1) IDENTITY:表自增键字段,Oracle 不支持这种方式;
2) AUTO: JPA 自动选择合适的策略,是默认选项;
3) SEQUENCE:通过序列产生主键,通过@SequenceGenerator 注解指定序列名, MySql 不支持这种方式;
4) TABLE:通过表产生主键,框架借由表模拟序列产生主键,使用该策略可以使 应用更易于数据库移植。不同的 JPA 实现商生成的表名是不同的,如 OpenJPA 生 成 openjpa_sequence_table 表 Hibernate 生成一个 hibernate_sequences 表,而 TopLink 则生成 sequence 表。这些表都具有一个序列名和对应值两个字段,如 SEQ_NAME 和 SEQ_COUNT。
JPA 教程
1.JPA概述 JPA(Java Persistence API)作为 Java EE 5.0 平台标准的 ORM 规范,将得到所有 Java EE 服务器的支持。Sun 这次吸取了之前 EJB 规范惨痛失败的经历,在充分吸收现 有 ORM 框架的基础上,得到了一个易于使用、伸缩性强的 ORM 规范。从目 前的 开发社区的反应上看,JPA 受到了极大的支持和赞扬,JPA 作为 ORM 领域标准化 整合者的目标应该不难实现。 JPA 通过 JDK 5.0 注解或 XML 描述对象-关系表的映射关系,并将运行期的实体 对象持久化到数据库中,图 1 很好地描述了 JPA 的结构:
jpa方法命名规则

jpa方法命名规则
JPA(Java Persistence API)方法命名规则是在开发过程中用来提高代码可读性和
可维护性的一个有效手段,它为代码指定一种名称,用于区分不同的函数或特定类型的变量。
JPA方法命名规则包括以下几个要素:
一、类名的命名:类名应该用明确形容的短语来表示,以便其他开发人员可以更容易
地识别应用程序中存在的类。
同时,类名应该采用大写字母开头,例如:UserController、UserEntity等。
二、方法名的命名:在定义方法名时,应使用被表达功能最直接的词汇,以便使方法
名可读性更强。
方法名称应尽量使用小写字母开头,例如:getUser()、setUser()等。
三、字段(变量)的命名:字段名应该简短作用,用于表达特定的概念。
字段名称还应
该使用小写字母开头,例如:id、name等。
四、常量的命名:常量名应用与其含义相关的单词表达,并且应该采用全大写的命名
方式,例如:MAX_USER_NUMBER 、PROPERTIES_FILE_PATH等。
另外,在JPA方法命名规则中,应该尽量避免使用连续或重复的字母,以及缩写单词
等不易读懂的映射方式。
一般来说,在定义函数和变量名称时,应该尽可能追求简洁、直
观且容易辨别,以便帮助其他开发人员更快更容易地理解某个类、函数或变量中包含的意图。
SpringBoot注解解析大全(非常全哦!)

SpringBoot注解解析⼤全(⾮常全哦!)使⽤注解的优势:1.采⽤纯java代码,不在需要配置繁杂的xml⽂件2.在配置中也可享受⾯向对象带来的好处3.类型安全对重构可以提供良好的⽀持4.减少复杂配置⽂件的同时亦能享受到springIoC容器提供的功能⼀、注解详解(配备了完善的释义)------(可采⽤ctrl+F 来进⾏搜索哦~~~~也可以收藏⽹页这样以后就不⽤往复查询了哦)@SpringBootApplication:申明让spring boot⾃动给程序进⾏必要的配置,这个配置等同于:@Configuration ,@EnableAutoConfiguration 和 @ComponentScan 三个配置。
@ResponseBody:表⽰该⽅法的返回结果直接写⼊HTTP response body中,⼀般在异步获取数据时使⽤,⽤于构建RESTful的api。
在使⽤@RequestMapping后,返回值通常解析为跳转路径,加上@esponsebody后返回结果不会被解析为跳转路径,⽽是直接写⼊HTTP response body中。
⽐如异步获取json数据,加上@Responsebody后,会直接返回json数据。
该注解⼀般会配合@RequestMapping⼀起使⽤。
@Controller:⽤于定义控制器类,在spring项⽬中由控制器负责将⽤户发来的URL请求转发到对应的服务接⼝(service层),⼀般这个注解在类中,通常⽅法需要配合注解@RequestMapping。
@RestController:⽤于标注控制层组件(如struts中的action),@ResponseBody和@Controller的合集。
@RequestMapping:提供路由信息,负责URL到Controller中的具体函数的映射。
@EnableAutoConfiguration:SpringBoot⾃动配置(auto-configuration):尝试根据你添加的jar依赖⾃动配置你的Spring应⽤。
JPA简介

JPA简介1.JPA简介:Java持久化规范,是从EJB2.x以前的实体Bean(Entity bean)分离出来的,EJB3以后不再有实体bean,而是将实体bean放到JPA中实现。
JPA是sun提出的一个对象持久化规范,各JavaEE应用服务器自主选择具体实现,JPA的设计者是Hibernate框架的作者,因此Hibernate作为Jboss服务器中JPA的默认实现,Oracle的Weblogic使用EclipseLink(以前叫TopLink)作为默认的JPA实现,IBM的Websphere和Sun的Glassfish默认使用OpenJPA(Apache的一个开源项目)作为其默认的JPA实现。
JPA的底层实现是一些流行的开源ORM(对象关系映射)框架,因此JPA其实也就是java实体对象和关系型数据库建立起映射关系,通过面向对象编程的思想操作关系型数据库的规范。
2.JPA的持久化策略文件:根据JPA规范要求,在实体bean应用中,需要在应用类路径(classpath)的META-INF目录下加入持久化配置文件——persistence.xml,该文件就是持久化策略文件。
其内容如下:注意:可以在持久化策略文件中配置多个持久化单元persistence-unit,在使用分布式数据库时经常配置多个持久化单元。
3.实体Bean的开发:JPA规范中定义的实体bean开发的基本规范:(1).在实体bean上添加”@Entity”注解,标识该bean为实体bean。
(2).实体bean必须序列化。
(3).使用”@Table(name=数据库表名)”注解,标识该实体bean映射到关系型数据库中的表名,如果不指定则JPA实现会自动生成默认的表名称。
(4).必须有一个使用”@Id”注解标识的主键,如指定自增主键的写法为:注意:@Id和@GeneratedValue两个注解必须同时使用,标识了注解之后,要主键的生成策略。
Hibernate注解用法总结

1.类级别注解@Entity 映射实体类@Table 映射数句库表@Entity(name="tableName") - 必须,注解将一个类声明为一个实体bean。
属性:name - 可选,对应数据库中的一个表。
若表名与实体类名相同,则可以省略。
@Table(name="",catalog="",schema="") - 可选,通常和@Entity配合使用,只能标注在实体的class 定义处,表示实体对应的数据库表的信息。
属性:name - 可选,表示表的名称,默认地,表名和实体名称一致,只有在不一致的情况下才需要指定表名catalog - 可选,表示Catalog名称,默认为Catalog("").schema- 可选, 表示Schema 名称, 默认为Schema("").2.属性级别注解@Id 映射生成主键@Version 定义乐观锁@Column 映射表的列@Transient 定义暂态属性2.1 与主键相关注解@Id - 必须,定义了映射到数据库表的主键的属性,一个实体只能有一个属性被映射为主键,置于getXxxx() 前。
@GeneratedV alue(strategy=GenerationType,generator="") - 可选,用于定义主键生成策略。
属性:Strategy - 表示主键生成策略,取值有:GenerationType.AUTO- 根据底层数据库自动选择(默认),若数据库支持自动增长类型,则为自动增长。
GenerationType.I NDENTITY- 根据数据库的Identity字段生成,支持DB2、MySQL、MS、SQL Server、SyBase与HyperanoicSQL数据库的Identity类型主键。
GenerationType.SEQUENCE -使用Sequence来决定主键的取值,适合Oracle、DB2等支持Sequence的数据库,一般结合@SequenceGenerator使用。
JPA_官方文档

JPA 教程1.JPA 概述JPA(Java Persistence API)作为Java EE 5.0 平台标准的ORM 规范,将得到所有Java EE服务器的支持。
Sun 这次吸取了之前EJB规范惨痛失败的经历,在充分吸收现有ORM 框架的基础上,得到了一个易于使用、伸缩性强的ORM 规范。
从目前的开发社区的反应上看,JPA受到了极大的支持和赞扬,JPA作为ORM 领域标准化整合者的目标应该不难实现。
JPA通过JDK 5.0 注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中,图1很好地描述了JPA的结构:Sun 引入新的JPA ORM 规范出于两个原因:其一,简化现有Java EE 和Java SE 应用的对象持久化的开发工作;其二,Sun 希望整合对ORM 技术,实现天下归一。
JPA由EJB 3.0 软件专家组开发,作为JSR-220 实现的一部分。
但它不囿于EJB3.0,你可以在Web 应用、甚至桌面应用中使用。
JPA 的宗旨是为POJO提供持久化标准规范,由此可见,经过这几年的实践探索,能够脱离容器独立运行,方便开发和测试的理念已经深入人心了。
目前Hibernate 3.2、TopLink 10.1.3以及OpenJpa 都提供了JPA的实现。
JPA的总体思想和现有Hibernate、TopLink,JDO等ORM 框架大体一致。
总的来说,JPA包括以下3方面的技术:ORM 映射元数据,JPA支持XML和JDK 5.0 注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中;JPA 的API,用来操作实体对象,执行CRUD操作,框架在后台替我们完成所有的事情,开发者从繁琐的JDBC 和SQL代码中解脱出来。
查询语言,这是持久化操作中很重要的一个方面,通过面向对象而非面向数据库的查询语言查询数据,避免程序的SQL语句紧密耦合。
JPA使用规范说明书2.0

JPA使用规范说明书科大讯飞股份有限公司2017年10月26日1 / 20版本记录1、JPA概述1.1 什么是JPA规范JPA规范(java持久化API)JPA和Hibernate等框架一样,都是java 持久化解决方案,负责把数据保存到数据库。
不同的是,JPA只是一种标注,规范,而不是框架。
JPA自己没有具体的实现。
使用JPA后,程序不在依赖于某种ORM框架。
具体实现有TopLink,Eclipselink, OpenJPA等。
随着ibatis,hibernate等优秀的ORM管理框架的出现,相比以上供应商,使得JPA性能有了很大的提升。
1.2 JPA原理实现我们知道JPA 只是一个规范,下面的JPA Provider 可以由不同的ORM 框架提供。
ORM 框架可以根据映射关系,操作PO对象,自动生成增查改删的SQLJPA包括以下3方面的技术:1. ORM映射元数据,JPA支持XML和JDK 5.0注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中;2. JPA的API,用来操作实体对象,执行CRUD操作,框架在后台替我们完成所有的事情,开发者从繁琐的JDBC和SQL代码中解脱出来。
3. 查询语言,这是持久化操作中很重要的一个方面,通过面向对象而非面向数据库的查询语言查询数据,避免程序的SQL语句紧密耦合。
使用JPA的优点也是有很多:继承Repository接口,在注解中书写JPQL语句即可访问数据库;支持方法名解析方式访问数据库;使用Predicate支持动态查询JPA当访问数据库主要工作1.得到JDBC驱动程序2.得到持久性提供者相关类库和配置文件3.提供实体类4.使用Persistence、EntityManagerFactory和Entity等接口。
2、JPA使用2.1 使用前的准备及配置2.1.1 原生配置方式java-persistenceMaven依赖:<dependency><groupId>org.eclipse.persistence</groupId><artifactId>javax.persistence</artifactId><version>2.0.0</version></dependency><dependency><groupId>org.eclipse.persistence</groupId><artifactId>eclipselink</artifactId><version>2.0.0</version></dependency>配臵文件(MATA-INF>下的persistence.xml)怎么去掉persistence.xml的实体类配置?使用了 persistence 配置文件,去掉“persistenceUnitName”属性,添加“packagesToScan”属性,persistence.xml配置文件中的persistence-unit名字照样保留,但是 persistence 配置文件中不需要对实体类进行配置,会自动识别。
JPA 批注参考

TopLink JPA-----5/12/06Java 5 (Java EE 5) Enterprise Java Bean (EJB) 3.0Java API (JPA)EJB Java EE 5Java(Java SE) 5EJB JavaJPA Java EEbeanJPAJava (POJO)JPA JPA Java EE EJBJava SEEJBJava JPA JPA Java JavaJPAJPAJavaJPA@Entity(configuration by exception)JSR-220 Enterprise JavaBean 3.0 JavaAPI1-1JPAllJPA Javadoc1-1 JPA1 JPAJPA Java JPAJava(POJO)JPAJPA JPA@EntityJPA@Table@SecondaryTable @SecondaryTables @Column @JoinColumn @JoinColumns@PrimaryKeyJoinColumn @PrimaryKeyJoinColumns @JoinTable @UniqueConstraintJPA ll@Id @IdClass@EmbeddedId @GeneratedValuel@SequenceGenerator@TableGeneratorJPA Java @Basic@Enumerated@Temporal@Lob@TransientJPA @OneToOne@ManyToOne@OneToMany@ManyToMany@MapKey@OrderByJPA @Embeddable@Embedded@AttributeOverride@AttributeOverrides@AssociationOverride@AssociationOverridesJPA @Inheritance@DiscriminatorColumn@DiscriminatorValue@MappedSuperclass@AssociationOverride@AssociationOverrides@AttributeOverride@AttributeOverridesJPAJPA@VersionJPAJPA 1-1@PrePersist@PostPersist@PreRemove@PostRemove @PreUpdate@PostUpdate@PostLoad@EntityListeners@ExcludeDefaultListeners@ExcludeSuperclassListenersJPA @PersistenceUnit@PersistenceUnits@PersistenceContext@PersistenceContexts@PersistencePropertyJPA @NamedQuery@NamedQueries@NamedNativeQuery@NamedNativeQueries@QueryHint@ColumnResult@EntityResult@FieldResult@SqlResultSetMapping@SqlResultSetMappings@AssociationOverrideJPA@MappedSuperclass@Embeddable@OneToOne @ManyToOne @JoinColumn@AssociationOverrides@Column@AttributeOverride1-4API1-2 @AssociationOverride@JoinColumn1-41-5@MappedSuperclass1-5@MappedSuperclass @JoinColumnlllllll1-1 @MappedSuperclass1-2 @AssociationOverride@AssociationOverrides@AssociationOverride1-5API1-3 @AssociationOverrides@AssociationOverride1-61-3 @AssociationOverrides@AttributeOverrideJPA@MappedSuperclass@Embeddable@Column@AttributeOverrides@JoinColumn@AssociationOverride1-4API1-4 @AttributeOverride@Column1-41-5@MappedSuperclass1-5@MappedSuperclass @Columnll_STRINGlllll1-4 @MappedSuperclass1-5 @AttributeOverride@AttributeOverrides@AttributeOverride1-5API1-5 @AttributeOverrides@AttributeOverride1-61-6 @AttributeOverrides@BasicJPA Javall1-6API1-6 @BasicJPAJPA1-71-7 @Basic@ColumnJPAll @SecondaryTablel1-7API1-7 @ColumnJPA SQLDDL JPA SQLDDL JPA DDL Java2DB TopLink JPAJPA255JPA 255JPAJPA0.JPA 00.JPA 0JPA @Table@SecondaryTable1-8JPAtrue @UniqueConstraintJPA1-8JPA JPA1-8 @Column@ColumnResult@NamedNativeQuery@EntityResult @FieldResult@SqlResultSetMapping1-8API1-8 @ColumnResultSQL1-91-101-111-9 @ColumnResult Order1-10 Item1-11 @SqlResultSetMapping @ColumnResult@DiscriminatorColumn@InheritanceJPAlll1-9API1-9 @DiscriminatorColumn1-1220@DiscriminatorValue1-13@DiscriminatorValue@DiscriminatorValue@DiscriminatorColumn@DiscriminatorColumn1-12 @DiscriminatorColumn @DiscriminatorValue —JPA SQLDDLJPASQLJPA@DiscriminatorValue31JPA255@DiscriminatorValueJPA”1-13 @DiscriminatorValue —@DiscriminatorValue@Inheritance JPA @DiscriminatorColumn @Entityll1-10API1-10 @DiscriminatorValue@DiscriminatorColumn1-1420 @DiscriminatorValue Array 1-15@DiscriminatorValue@DiscriminatorValue@DiscriminatorColumn@DiscriminatorColumn1-14 @DiscriminatorColumn @DiscriminatorValue —1-15 @DiscriminatorValue —@EmbeddableJPAAPI1-16@Embedded1-17 1-16 @Embeddable@EmbeddedJPA@Embeddable@Embeddable@Embeddable@Column@AttributeOverrideAPI1-17@Embeddable1-16@AttributeOverrideJPA @Embeddable 1-17 @Embedded@EmbeddedIdJDKl Java (POJO)l public publicl public protectedll@IdClassAPI1-18@Embeddable1-191-181-19 @EmbeddedId@EntityJava (POJO) JPA POJO JPA 1-11API1-11 @EntityJPA 1-20”1-201-20 @Entity@EntityListeners@Entity@MappedSuperclassl APIlJPAl Java (POJO)ll@ExcludeDefaultListeners@ExcludeSuperclassListeners 1-12API1-12 @EntityListeners@Entity@MappedSuperclass1-211-221-23 1-231-21 @EntityListeners1-22 EmployeePersistListener1-23 EmployeeRemoveListener@EntityResult@NamedNativeQuery@ColumnResult@FieldResult@SqlResultSetMapping1-8API1-13 @EntityResultJPA @InheritanceJPASELECT SELECT@FieldResult@FieldResult 1-241-251-261-24 @EntityResult Order1-25 Item1-26 @SqlResultSetMapping @EntityResult@EnumeratedJPAString JPA@Basic1-14API1-14 @EnumeratedJPA 1-28String1-271-281-271-28 @Enumerated@ExcludeDefaultListeners@PersistenceUnit@EntityListeners JPA@Entity@MappedSuperclassAPI1-291-29 @ExcludeDefaultListeners@ExcludeSuperclassListeners@Entity@MappedSuperclass@EntityListeners JPA@Entity@MappedSuperclass@ExcludeDefaultListenersAPI1-291-301-31 @ExcludeSuperclassListeners@FieldResult@NamedNativeQueryJPA @EntityResult SELECTAS@EntityResult@ColumnResult@SqlResultSetMapping1-15API1-15 @FieldResult1-321-331-34 1-32 @EntityResult @FieldResult Order1-33 Item1-34 @SqlResultSetMapping @EntityResult@GeneratedValueJPA @Idll1-16API1-16 @GeneratedValueJPAJPAl—l—l—@SequenceGeneratorl—@TableGenerator 1-351-35 @GeneratedValue@Idll @IdClassl @EmbeddedIdAPIJPA @GeneratedValueJPA1-361-36 @Id@IdClassJDKl Java (POJO)l public publicl public protectedlll @Id@EmbeddedId1-17API1-17 @IdClass@AttributeOverride1-371-38EJB 3.0 @Id 1-371-38 @IdClass@InheritanceJPA1-18API1-18 @InheritanceJPA @DiscriminatorColumn@DiscriminatorValueFoot?1?—@DiscriminatorColumnl@DiscriminatorValuel—l—Footnote?1?1-391-401-39 @Inheritance —JOINED1-40 @Inheritance —JOINED1-41@DiscriminatorColumn@DiscriminatorValue1-42 1-41 @Inheritance —1-42 @Inheritance —@JoinColumnJPAlll@JoinColumnsl@JoinTable1-19API1-19 @JoinColumnJPA SQLDDL JPA SQLJPAJPAl+_+l+_+@JoinTable+_ +@JoinTableJPAJPA@JoinTableJPA @Table@SecondaryTable1-8JPAJPA1-43JPA1-43 @JoinColumn@JoinColumnsJPA1-20API1-20 @JoinColumns@JoinColumn1-441-44 @JoinColumns@JoinTableJPAJPAlllll1-21API 1-21 @JoinTable1-451-45 @JoinTableJPAJPA JPA+_+@JoinColumnJPA + _+@JoinColumnJPA1-45 JPAJPAJPA@UniqueConstraint@LobJPA@BasicLob LobClob Blob @ColumnAPI1-461-46 @Lob@ManyToManyJPAlllll@JoinTable1-22API1-22 @ManyToManyJPAl—l—mergel—persistl—refreshl—JPAJPA1-481-471-481-47 @ManyToMany —Customer1-48 @ManyToMany —PhoneNumber@ManyToOneJPAllll1-23API1-23 @ManyToOneJPAl—l—mergel—persistl—refreshl—JPAJPAJPA1-491-49 @ManyToOne@MapKeyJPAl @Idl @IdClassll @EmbeddedId@UniqueConstraint1-24API1-24 @MapKeyJPA @IdClass1-52Project 1-521-521-511-50 @MapKey Project1-51 Employee1-52 EmployeePK@MappedSuperclassJPA@Basic @ManyToMany@AttributeOverride@AssociationOverrideAPI1-531-54@AttributeOverride 1-53 @MappedSuperclass1-54 @MappedSuperclass@NamedNativeQueries@NamedNativeQuery1-5API1-25 @NamedNativeQueries@NamedNativeQuery1-61-55 @NamedNativeQueries@NamedNativeQueryJPA@Entity@MappedSuperclassl SQLllll @ColumnResult@EntityResult@FieldResult @SqlResultSetMapping@NamedNativeQueries@NamedQuery1-6API1-26 @NamedNativeQuerySQLSQLJPA SQL@QueryHint1-60JPAJPA SQLJPA JDBC@SqlResultSetMapping1-59SQL 1-601-56 @NamedNativeQuery Oracle1-57@NamedQueries@NamedQuery1-5API1-27 @NamedQueries@NamedQuery1-61-58 @NamedQueries@NamedQueryJPA@Entity@MappedSuperclassl JPA JSR-000220 Enterprise JavaBeans v3.0 4llll@NamedQueriesSQL @NamedNativeQuery SQL1-6API1-28 @NamedQueryJPAJPA JSR-000220 Enterprise JavaBeans v.3.0 4JPA SQL@QueryHint1-601-59JPA 1-601-59 @NamedQuery1-60@OneToManyJPAllll @JoinTable1-29API1-29 @OneToManyJPAl-l-mergel-persistl-refreshl-JPA1-62Collection1-611-621-61 @OneToMany -Customer1-62 @ManyToOne -Order@OneToOneJPAllll1-30API1-30 @OneToOneJPAl-l-mergel-persistl-refreshl-JPAJPA1-64JPAJPA1-631-641-63 @OneToOne -Customer1-64 @OneToOne -CustomerRecord@OrderByJPA@OneToMany@ManyToManyll1-31API1-31 @OrderByJPA"|”1-651-65Project1-661-65 Project1-66 Employee@PersistenceContextJPA Java EE JNDIll JNDIl@PersistenceUnitll @PersistenceProperty@PersistenceContexts1-32API1-32 @PersistenceContextJPAJNDIJPAJPA TopLink JPA Persistence.xml@PersistencePropertyJPAllllJPA@PersistenceUnitJNDI1-671-68JNDI1-67 @PersistenceContext1-68 @PersistenceContext JNDI@PersistenceContexts@PersistenceContext1-33API1-33 @PersistenceContexts@PersistenceContext1-691-69 @PersistenceContexts@PersistencePropertyJPA @PersistenceContextll JPA1-34API1-34 @PersistencePropertyJPAJPA1-70TopLink Essentials JPA TopLink TopLink JPA Persistence.xml1-70 @PersistenceProperty@PersistenceUnitJPA @PersistenceContextJPAll@PersistenceUnits1-34API1-35 @PersistenceUnitJPAJPAJNDIJPA@PersistenceContextJNDI1-71JNDI JPA JNDI JNDI1-71 @PersistenceUnit1-72@PersistenceContext JPA JNDI1-72 @PersistenceContext unitName@PersistenceUnits@PersistenceUnit1-36API1-36 @PersistenceUnits@PersistenceUnit 1-73@PersistenceContext1-73 @PersistenceUnits@PrimaryKeyJoinColumn@Inheritance JPAll @SecondaryTablel @OneToOnel @PrimaryKeyJoinColumns1-37API1-37 @PrimaryKeyJoinColumnJPA SQLDDL JPA SQL@OneToOneJPAl@Inheritancel@SecondaryTablel@OneToOneJPAl@Inheritancel@SecondaryTablel@OneToOne1-741-751-74 @PrimaryKeyJoinColumn -InheritanceType.JOINED1-75 @PrimaryKeyJoinColumn -InheritanceType.JOINED@PrimaryKeyJoinColumnsJPA1-38API1-38 @PrimaryKeyJoinColumns@PrimaryKeyJoinColumn1-761-76 @PrimaryKeyJoinColumns@QueryHintJPA @NamedQuery@NamedNativeQueryJPAll JPA1-6API1-39 @QueryHintJPAJPA1-77TopLink Essentials JPATopLink TopLink JPA1-77 @QueryHint@SecondaryTableJPA @TableJPA@Column@SecondaryTables1-40API1-40 @SecondaryTableJPAJPA@PrimaryKeyJoinColumnJPAJPA@UniqueConstraint1-78JPA@Column 1-78 @SecondaryTable@SecondaryTables@SecondaryTable1-41API1-41 @SecondaryTables@SecondaryTable1-79JPAJPA@Column1-79 @SecondaryTables@SequenceGenerator@GeneratedValuelll1-42API1-42 @SequenceGenerator50.JPA 500.JPA 0JPA1-801-80 @SequenceGenerator@SqlResultSetMapping@NamedNativeQuery1-81JPA SQLlll1-81 SQLSQL JPA JDBC lll@SqlResultSetMappings1-8API1-43 @SqlResultSetMapping1-821-831-841-82 @SqlResultSetMapping Order1-83 Item1-84 @SqlResultSetMapping @EntityResult@SqlResultSetMappings@SqlResultSetMappingSQL1-5API1-44 @SqlResultSetMappingsSQL1-84JPA@ColumnResultJPASELECTSELECT@EntityResultSQL @SqlResultSetMapping1-85@SqlResultSetMapping1-85 @SqlResultSetMappings@TableJPA @EntityllJPA @SecondaryTable 1-45API1-45 @TableJPAJPA 1-861-86 JPAJPAJPAuniqueContraints@UniqueConstraint1-861-86 @Table@TableGenerator@GeneratedValuelllll1-46API 1-46 @TableGenerator1-871-87 @TableGenerator @Temporal50.JPA 50JPA0.JPA 0 JPAJPAJPAJPA IDJPA@UniqueConstraintJPA IDJPA@Basic1-14API1-47 @Temporal1-88JPA()1-88 @Temporal@TransientJPAJPA@Entity@MappedSuperclass@Embeddable API1-89JPA1-89 @Transient@UniqueConstraintJPADDL@Column1-48API1-48 @UniqueConstraint1-901-90 @Table@VersionJPAJPAl-l-l-JPAll@TablelAPI1-91getVersionNum OPTLOCK@Column 1-91 @Versionl@PostLoadl@PostPersistl@PostRemovel@PostUpdatel@PrePersistl@PreRemovel@PreUpdate1-1JPA@EntityListenersll1-1 JPA@PostLoadAPI@PostPersistPostPersistAPI@PostRemoveAPI@PostUpdateAPI@PrePersistEntityManagerAPI@PreRemoveEntityManagerAPI @PreUpdateAPIl A¡@AssociationOverride¡@AssociationOverrides¡@AttributeOverride¡@AttributeOverridesl B¡@Basicl C¡@Column¡@ColumnResultl D¡@DiscriminatorColumn¡@DiscriminatorValuel E¡@Embeddable¡@Embedded¡@EmbeddedId¡@Entity¡@EntityListeners¡@EntityResult¡@Enumerated¡@ExcludeDefaultListeners¡@ExcludeSuperclassListeners l F¡@FieldResultl G¡@GeneratedValuel I¡@Id¡@IdClass¡@Inheritancel J¡@JoinColumn¡@JoinTablel L¡@Lobl M¡@ManyToMany¡@ManyToOne¡@MapKey¡@MappedSuperclassl N¡@NamedNativeQueries¡@NamedNativeQuery¡@NamedQueries¡@NamedQueryl O¡@OneToMany¡@OneToOne¡@OrderByl P¡@PersistenceContext¡@PersistenceContexts¡@PersistenceProperty¡@PersistenceUnit¡@PersistenceUnits¡@PrimaryKeyJoinColumn¡@PrimaryKeyJoinColumns l Q¡@QueryHintl S¡@SecondaryTable¡@SecondaryTables¡@SequenceGenerator¡@SqlResultSetMapping¡@SqlResultSetMappings l T¡@Table¡@TableGenerator¡@Temporal¡@Transientl Ul V¡@VersionTopLink JPA -----© , Oracle.。
jpa 字符串数组

jpa 字符串数组在Java Persistence API (JPA) 中,处理字符串数组(String array)与处理其他类型的数组类似。
以下是一个简单的例子,展示了如何在JPA实体类中使用字符串数组:```javaimport javax.persistence.*;@Entitypublic class MyEntity {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;// 字符串数组字段@Column(name = "string_array_column")@Basic(fetch = ZY)private String[] stringArray;// ... 其他字段和getter/setter方法public String[] getStringArray() {return stringArray;}public void setStringArray(String[] stringArray) {this.stringArray = stringArray;}}```在上面的例子中:* 我们定义了一个实体类`MyEntity`。
* 使用`@Entity`注解来标识这是一个实体类。
* 使用`@Id`和`@GeneratedValue(strategy =GenerationType.IDENTITY)`注解来标识主键字段。
* 使用`@Column(name = "string_array_column")`注解来指定字符串数组字段在数据库中的列名。
* 使用`@Basic(fetch = ZY)`注解来标识这是一个基本属性,并设置其加载策略为延迟加载。
* 提供了`getStringArray()`和`setStringArray(String[] stringArray)`方法来访问和修改字符串数组字段。
MyBatis还是JPA?终于有答案了

MyBatis还是JPA?终于有答案了对于⼀个和数据库打交道的程序员来说,很快会⾯临着⼀个艰难的选择。
到底是选择MyBatis还是JPA呢?很多⼈说,技术选择,都要根据需求来,这个没错。
但是,除了需求,还有很重要的⼀个环节,那就是队友的⽔平。
如果你选择了⼀些⽐较⾼级的技术,那么就是在给整个团队埋坑。
JPA的抽象层次更⾼,代码写起来也更简洁,但是它⼀点都不简单。
虽然经过了多次的培训,我呆过的⼏个团队,还是把它⽤的和屎⼀样。
我扔掉了JPA我仔细想了⼀下,有下⾯⼏点原因,造成了JPA在很多团队根本就玩不下去。
JPA适合业务模型固定的场景,适合⽐较稳定的需求。
但是国内这种朝三暮四的需求风格,产品经理这种传话筒式的设计模式,造成了需求的泛滥和不确定。
JPA在这种模式下就是渣。
JPA的技术要求⽐较⾼。
不要怀疑,你刚开始⽤起⾥可能觉得⾮常简单。
但随着你的深⼊使⽤,你会发现这是⼀个灾难。
⾥⾯的各种转换和缓存,会把⼈绕晕。
⽽⼤多数的快餐程序员是不想要了解这些的。
很多程序员很会写SQL,所以很多SQL语句长的很胖,长的要命。
业务混乱,多张表关联,我甚⾄见过上百张业务表关联的复杂业务。
DBA⽆奈之下,通常都会有sql审核。
JPA搞sql审核?还是弱了⼀点。
所以,不是JPA不好,⽽是它不符合国情⽽已。
想要在公司内推⾏JPA,你需要给我⼀个稳定的产品团队、⼀个⽜X的技术团队才⾏。
所以,⼤多数公司宁可写⼀堆重复的、乱七⼋糟的Mybaits代码,也不会轻易尝试JPA,这是符合逻辑的,符合事物发展规律的。
所以,我们下⾯的⽂章就是来讨论MyBatis的,来看⼀下Mybaits到底要怎么写才算优雅。
MyBatis为什么不好⽤优秀的程序员都是很懒的。
所以很多⼈不想设计实体的sql。
JPA可以直接根据Java的实体代码,⽣成sql的库表,这在使⽤Mybatis的⼈来看,是⾮常羡慕的。
使⽤MyBatis,要倒着来。
需要先设计库表,然后根据库表反向⽣成⼀堆Java代码和配置⽂件。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
JPA 教程1.JPA概述JPA(Java Persistence API)作为Java EE 5.0平台标准的ORM规范,将得到所有Java EE服务器的支持。
Sun这次吸取了之前EJB规范惨痛失败的经历,在充分吸收现有ORM框架的基础上,得到了一个易于使用、伸缩性强的ORM规范。
从目前的开发社区的反应上看,JPA受到了极大的支持和赞扬,JPA作为ORM领域标准化整合者的目标应该不难实现。
JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中,图 1很好地描述了JPA的结构:Sun引入新的JPA ORM规范出于两个原因:其一,简化现有Java EE和Java SE应用的对象持久化的开发工作;其二,Sun希望整合对ORM技术,实现天下归一。
JPA由EJB 3.0软件专家组开发,作为JSR-220实现的一部分。
但它不囿于EJB 3.0,你可以在Web应用、甚至桌面应用中使用。
JPA的宗旨是为POJO提供持久化标准规范,由此可见,经过这几年的实践探索,能够脱离容器独立运行,方便开发和测试的理念已经深入人心了。
目前Hibernate 3.2、TopLink 10.1.3以及OpenJpa都提供了JPA的实现。
JPA的总体思想和现有Hibernate、TopLink,JDO等ORM框架大体一致。
总的来说,JPA包括以下3方面的技术:ORM映射元数据,JPA支持XML和JDK 5.0注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中;JPA 的API,用来操作实体对象,执行CRUD操作,框架在后台替我们完成所有的事情,开发者从繁琐的JDBC和SQL代码中解脱出来。
查询语言,这是持久化操作中很重要的一个方面,通过面向对象而非面向数据库的查询语言查询数据,避免程序的SQL语句紧密耦合。
2.实体对象访问数据库前,我们总是要设计在应用层承载数据的领域对象(Domain Object),ORM框架将它们持久化到数据库表中。
为了方便后面的讲解,我们用论坛应用为例,建立以下的领域对象:Topic是论坛的主题,而PollTopic是调查性质的论坛主题,它扩展于Topic,一个调查主题拥有多个选项PollOption。
这三个领域对象很好地展现了领域对象之间继承和关联这两大核心的关系。
这3个领域对象将被映射到数据库的两张表中:其中,Topic及其子类PollTopic将映射到同一张t_topic表中,并用topic_type字段区分两者。
而PollOption映射到t_polloption中。
具有ORM元数据的领域对象称为实体(Entity),按JPA的规范,实体具备以下的条件:必须使用javax.persistence.Entity注解或者在XML映射文件中有对应的元素;必须具有一个不带参的构造函数,类不能声明为final,方法和需要持久化的属性也不能声明为final;如果游离状的实体对象需要以值的方式进行传递,如通Session bean的远程业务接口传递,则必须实现Serializable接口;需要持久化的属性,其访问修饰符不能是public,它们必须通过实体类方法进行访问。
3.使用注解元数据基本注解首先,我们对Topic领域对象进行注解,使其成为一个合格的实体类:代码清单1:Topic实体类的注解package com.baobaotao.domain;…import javax.persistence.Column;import javax.persistence.DiscriminatorColumn;import javax.persistence.DiscriminatorType;import javax.persistence.DiscriminatorValue;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.GenerationType;import javax.persistence.Id;import javax.persistence.Inheritance;import javax.persistence.InheritanceType;import javax.persistence.Temporal;import javax.persistence.TemporalType;@Entity(name = "T_TOPIC") ①public class Topic implements Serializable ...{@Id ②-1@GeneratedValue(strategy = GenerationType.TABLE)②-2@Column(name = "TOPIC_ID") ②-3private 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;//省略get/setter方法}@Entity:将领域对象标注为一个实体,表示需要保存到数据库中,默认情况下类名即为表名,通过name属性显式指定表名,如①处的name = "T_TOPIC",表示Topic保存到T_TOPIC表中;@Id :对应的属性是表的主键,如②-1所示;@GeneratedValue:主键的产生策略,通过strategy属性指定。
默认情况下,JPA自动选择一个最适合底层数据库的主键生成策略,如SqlServer对应identity,MySql 对应auto increment。
在javax.persistence.GenerationType中定义了以下几种可供选择的策略:1) IDENTITY:表自增键字段,Oracle不支持这种方式;2) AUTO: JPA自动选择合适的策略,是默认选项;3) SEQUENCE:通过序列产生主键,通过@SequenceGenerator注解指定序列名,MySql不支持这种方式;4) TABLE:通过表产生主键,框架借由表模拟序列产生主键,使用该策略可以使应用更易于数据库移植。
不同的JPA实现商生成的表名是不同的,如 OpenJPA生成openjpa_sequence_table表Hibernate生成一个hibernate_sequences表,而TopLink则生成sequence表。
这些表都具有一个序列名和对应值两个字段,如SEQ_NAME和SEQ_COUNT。
@Column(name = "TOPIC_ID"):属性对应的表字段。
我们并不需要指定表字段的类型,因为JPA会根据反射从实体属性中获取类型;如果是字符串类型,我们可以指定字段长度,以便可以自动生成DDL语句,如③处所示;@Temporal(TemporalType.DATE):如果属性是时间类型,因为数据表对时间类型有更严格的划分,所以必须指定具体时间类型,如④所示。
在javax.persistence.TemporalType枚举中定义了3种时间类型:1) DATE :等于java.sql.Date2) TIME :等于java.sql.Time3) TIMESTAMP :等于java.sql.Timestamp继承关系Topic和PollTopic是父子类,JPA 采用多种方法来支持实体继承。
在父类中必须声明继承实体的映射策略,如代码清单2所示:代码清单2:继承实体的映射策略…@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 ...{…}对于继承的实体,在javax.persistence.InheritanceType定义了3种映射策略:SINGLE_TABLE:父子类都保存到同一个表中,通过字段值进行区分。
这是我们Topic实体所采用的策略, Topic和PollTopic都保存到同一张表中,通过TOPIC_TYPE字段进行区分,Topic在T_TOPIC表中对应TOPIC_TYPE= 1的记录,而PollTopic对应TOPIC_TYPE=2的记录(稍后在PollTopic实体中指定);区别的字段通过 @DiscriminatorColumn说明,如②所示,区分字段对应该实体的值通过@DiscriminatorValue指定,如③所示;JOINED:父子类相同的部分保存在同一个表中,不同的部分分开存放,通过表连接获取完整数据;TABLE_PER_CLASS:每一个类对应自己的表,一般不推荐采用这种方式。
关联关系我们再继续对PollTopic进行注解,进一步了解实体继承的JPA映射定义:代码清单3:PollTopic映射描述package com.baobaotao.domain;…@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。