JPA(三):JPA基本注解
基本注解
@Entity
标注用于实体类声明语句之前,指出该Java类为实体类,将映射到指定的数据库表。如声明一个实体类Customer,将它映射到数据的coustomer表上。
package com.dxsoft.jpa.helloword; import javax.persistence.Entity; @Entity
public class Person {
//...
}
@Table
- 当实体类与其映射的数据库表名不同名时,需要使用@Table标注说明,该注解与@Entity标注并列使用,置于实体类声明语句之前,可写于单独语句行,也可与声明数据同行。
- @Table标注的常用选项是name,用于指明数据库的表名。
- @Table标注还有两个可选项catalog和schema用于设置表所属的数据库目录或模式,通常为数据库名。
- uniqueConstraints选项用于设置约束条件,通常不须设置。
package com.dxsoft.jpa.helloword; import javax.persistence.Entity;
import javax.persistence.Table; @Entity
@Table(name = "jpa_person")
public class Person {
//。。。
}
@Id
- @Id标注用于声明一个实体类的属性映射为数据库的主键列。该属性通常置于属性声明语句之前,可与声明数据同行,也可卸载单独行上。
- @Id标注也可置于属性的getter方法之前。
@GeneratedValue
- @GeneratedValue用于标注主键的生成策略,通过strategy属性指定。默认情况下,JPA自动选择一个最合适底层数据库的主键生成策略:SqlServer对应identity,MySql对饮auto increment。
- 在javax.persistence.GenerationType中定义了以下几种可供选择的策略:
- --- IDENTITY:采用数据库ID自增长的方式来自增主键字段,Oracle不支持这种方式(oracle12g后,应该支持了。);
- --- AUTO:JPA自动选择合适的策略,是默认选项;
- --- SEQUENCE:通过序列产生主键,通过@SequenceGenerator注解指定序列名,MySql不支持这种方式。
- --- TABLE:通过表产生键,框架借助由表模拟序列产生主键,使用该策略可以使应用更易于数据库移植。

@Column
- 当实体的属性与其映射的数据库表的列不同名时需要使用@Column标注说明,该属性通常置于实体的属性声明语句之前,还可与@Id标注一起使用。
- @Column标注的常量属性是name,用于设置映射数据库表的列名。此外,该注解还包含其他多个属性,比如:unique,nullable,length等。
- @Column标注的columnDefinition属性:表示该字段在数据中的实际类型,通常ORM框架可以根据属性类型自动判断数据中的字段的类型,但是对于Date类型仍无法确定数据库中字段类型究竟是Date,Time还是Timestamp。此外,String的默认类型为varchar,如果要将String类型映射到特定数据库的BLOB或Text字段类型。
- @Column标注也可以置于属性的getter方法之前。

@Basic
- @Basic表示一个简单的属性到数据库表的字段的映射,对于没有任何标注的getXxx()方法,默认即为Basic
- fetch:表示该属性的读取策略,有EAGER和LAZY两种,分别表示主支抓取和延迟加载,默认为EAGER
- optional:表示该属性是否允许为null,默认为true。

@Transient
- 表示该属性并非一个到数据库表的字段的映射,ORM框架将忽略该属性。
- 如果一个属性并非数据库的字段映射,就务必将其标示为@Transient,否则,ORM框架默认其注解为@Basic。
假设Person类需要扩展一个帮助方法,getUserInfo()
// 帮助方法,不希望保存到数据库,但是需要动态获取Customer对象的属性。
public String getUserInfo() {
return "username:" + fullName + ",age:" + age;
}
此时,运行时抛出异常。
解决上边需求,而且又不抛异常的方案:需要在getUserInfo()方法上添加注解@Transient

@Temporal
- 在核心的JAVA API中并没有定义Date类型的精度(temporal precision)。而在数据库中,表示Date类型的数据类型有DATE,TIME和TEIMSTAMP三种精度(即单纯的日期,时间,或者两者兼备)。在运行属性映射是可使用
- @Temporal注解来调整Date精度。
修改项目:
1)修改Person实体类,新增birth,createTime字段
package com.dxsoft.jpa.helloword; import java.util.Date; import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Transient; @Entity
@Table(name = "jpa_person")
public class Person {
private Integer id;
private String fullName;
private int age;
private Date birth;
private Date createTime; public Person() { } @GeneratedValue(strategy = GenerationType.AUTO)
@Id
public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} @Column(name = "full_name", nullable = false, length = 64)
public String getFullName() {
return fullName;
} public void setFullName(String fullName) {
this.fullName = fullName;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public Date getBirth() {
return birth;
} public void setBirth(Date birth) {
this.birth = birth;
} public Date getCreateTime() {
return createTime;
} public void setCreateTime(Date createTime) {
this.createTime = createTime;
} // 帮助方法,不希望保存到数据库,但是需要动态获取Customer对象的属性。
@Transient
public String getUserInfo() {
return "username:" + fullName + ",age:" + age;
} @Override
public String toString() {
return "Person [id=" + id + ", fullName=" + fullName + ", age=" + age + "]";
} }
2)修改测试main函数

此时,删除mysql数据中的jpa_person表,重新运行。
运行日志:
Hibernate:
create table hibernate_sequence (
next_val bigint
) engine=InnoDB
Hibernate:
insert into hibernate_sequence values ( 1 )
Hibernate:
create table jpa_person (
id integer not null,
age integer not null,
birth datetime,
createTime datetime,
full_name varchar(64) not null,
primary key (id)
) engine=InnoDB
Fri Jun 15 12:25:35 CST 2018 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
Hibernate:
select
next_val as id_val
from
hibernate_sequence for update
Hibernate:
update
hibernate_sequence
set
next_val= ?
where
next_val=?
Hibernate:
insert
into
jpa_person
(age, birth, createTime, full_name, id)
values
(?, ?, ?, ?, ?)
六月 15, 2018 12:25:35 下午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl stop
INFO: HHH10001008: Cleaning up connection pool [jdbc:mysql://127.0.0.1:3306/jpa]
complete..
此时查看mysql中表


显然这里的createTime可以使用,但是birth的日期精度要求是短日期格式就可以。
使用@Temporal注解来调整Date精度
修改person.java实体类

删除mysql中数据库jpa_person表,重新运行查看数据表结构,及数据。
运行日志:
Hibernate:
create table hibernate_sequence (
next_val bigint
) engine=InnoDB
Hibernate:
insert into hibernate_sequence values ( 1 )
Hibernate:
create table jpa_person (
id integer not null,
age integer not null,
birth date,
createTime datetime,
full_name varchar(64) not null,
primary key (id)
) engine=InnoDB
Fri Jun 15 12:30:16 CST 2018 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
Hibernate:
select
next_val as id_val
from
hibernate_sequence for update
Hibernate:
update
hibernate_sequence
set
next_val= ?
where
next_val=?
Hibernate:
insert
into
jpa_person
(age, birth, createTime, full_name, id)
values
(?, ?, ?, ?, ?)
六月 15, 2018 12:30:16 下午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl stop
INFO: HHH10001008: Cleaning up connection pool [jdbc:mysql://127.0.0.1:3306/jpa]
complete..


用table来生成数据表的主键
- 将当前主键的值单独保存到一个数据的表中,主键的值每次都是从指定的表中查询获得
- 这种方式生成主键的策略可以适用于任何数据库,不必担心不同数据不兼容造成的问题。
1)修改Person.java
@TableGenerator(
name = "person_id_generator",
table = "jpa_id_generator",
pkColumnName = "pk_name",
pkColumnValue = "person_id",
valueColumnName = "pk_value",
initialValue = 1,
allocationSize = 100)
@GeneratedValue(
strategy = GenerationType.TABLE,
generator = "person_id_generator")
@Id
public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
}
2)删除已经存在表jpa_person,重新执行三次main函数:
3)发现新增了jpa_id_generator表,表jpa_id_generator中也有了记录:
jpa_person记录为:

jpa_id_generator记录为:

JPA(三):JPA基本注解的更多相关文章
- JPA @Id 和 @GeneratedValue 注解详解
JPA @Id 和 @GeneratedValue 注解详解 @Id: @Id 标注用于声明一个实体类的属性映射为数据库的主键列.该属性通常置于属性声明语句之前,可与声明语句同行,也可写在单独行上 ...
- 转:使用 Spring Data JPA 简化 JPA 开发
从一个简单的 JPA 示例开始 本文主要讲述 Spring Data JPA,但是为了不至于给 JPA 和 Spring 的初学者造成较大的学习曲线,我们首先从 JPA 开始,简单介绍一个 JPA 示 ...
- 使用 Spring Data JPA 简化 JPA 开发
从一个简单的 JPA 示例开始 本文主要讲述 Spring Data JPA,但是为了不至于给 JPA 和 Spring 的初学者造成较大的学习曲线,我们首先从 JPA 开始,简单介绍一个 JPA 示 ...
- 三。Hibernate 注解形式
Hibernate支持JPA注解的jar包 JPA全称: Java Persistence API JPA和Hibernate之间的关系,可以简单的理解为JPA是标准接口,Hibernate是实现. ...
- Spring Data JPA 梳理 - JPA与“Spring、Spring Data JPA”的关系
JPA其实也就是java实体对象和关系型数据库建立起映射关系,通过面向对象编程的思想操作关系型数据库的规范. Spring 框架对 JPA 提供的支持主要体现在如下几个方面: 首先,它使得 JPA 配 ...
- Spring Data JPA 梳理 - JPA是什么
总结: JPA是java的标准,不是Spring的标准 java标准中一般通过Meta-INF文件规范开发层面的事情,JPA也不例外,使用persistence.xml JPA定义了Entity 到 ...
- 【Spring Data 系列学习】了解 Spring Data JPA 、 Jpa 和 Hibernate
在开始学习 Spring Data JPA 之前,首先讨论下 Spring Data Jpa.JPA 和 Hibernate 之前的关系. JPA JPA 是 Java Persistence API ...
- spring data jpa hibernate jpa 三者之间的关系
JPA规范与ORM框架之间的关系是怎样的呢? JPA规范本质上就是一种ORM规范,注意不是ORM框架——因为JPA并未提供ORM实现,它只是制订了一些规范,提供了一些编程的API接口,但具体实现则由服 ...
- Annotation(三)——Spring注解开发
Spring框架的核心功能IoC(Inversion of Control),也就是通过Spring容器进行对象的管理,以及对象之间组合关系的映射.通常情况下我们会在xml配置文件中进行action, ...
- Spring学习笔记(三)—— 使用注解配置spring
一.使用步骤 1.1 导包 1.2 为主配置文件引入新的命名空间(约束) 在applicationContext.xml中引入context约束 1.3 编写相关的类 public class Use ...
随机推荐
- ftp通用类1
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.N ...
- 《Go语言实战》摘录:6.3 并发 - 竞争状态
6.3 并发 - 竞争状态
- Revit Family API 添加类型
FamilyManager.NewType("");添加新类型,然后设置参数,就是为新类型设置参数. [TransactionAttribute(Autodesk.Revit.At ...
- 加快Qemu Aarch32虚拟开发板的启动速度
软件版本 Qemu: 2.8.0 虚拟开发板: vexpress-ca9 概述 之前的博文介绍了将Python移植到开发板上, 根文件系统采用的是ramdisk, 这个文件系统的缺点是修改的内容重启会 ...
- 使用Axure RP原型设计实践01,使用概述
首先认识Axure RP Pro 7.0软件的默认界面布局.最上面的是工具栏区域,左侧上方的是网站地图区域(sitemap),左侧中部的是部件区域(Widgets),左侧下方的是模板区域(Master ...
- lufylegend:加载进度
实现图片加载进度 LoadingSample Class 用来显示进度条的对象. 引擎中目前提供的进度条类有:LoadingSample1-7 你可以制作自己的进度条,自制进度条类中要包含setPro ...
- Java Calendar,Date,DateFormat,TimeZone,Locale等时间相关内容的认知和使用(6) Locale
本章介绍Locale. 1 Locale 介绍 Locale 表示地区.每一个Locale对象都代表了一个特定的地理.政治和文化地区. 在操作 Date, Calendar等表示日期/时间的对象时,经 ...
- Android 开机画面和wallpaper总结
Android 开机画面和wallpaper总结 1 kernel的开机画面修改 1.图片需求:图片格式:png图片大小:1024x600(具体示lcd分辨率而定). 2.转换图片png图片. 假设 ...
- NSZombie 详解 -僵尸对象
1.什么是僵尸对象? 简而言之,就是过度释放的对象. 2.僵尸对象有什么特点? 如果一个对象a被变成了僵尸对象,那么,在进行下面的判断时,a是会被系统当成一个对象来进行判断的.但是,如果你使用a进行其 ...
- C#编程(四十一)----------用户定义的数据类型转换
用户定义的数据类型转换 C#允许定义自己的 数据类型,这意味着需要某些 工具支持在自己的数据类型间进行数据转换.方法是把数据类型转换定义为相关类的一个成员运算符,数据类型转换必须声明为隐式或者显式,以 ...