当前位置: 首页 > 编程日记 > 正文

3、JPA一些常用的注解

常用注解有下面这些:

①:@Entity、@Table、@Id、@GeneratedValue、@Column、@Basic

②:@Transient 用于忽略某个属性,而不对该属性进行持久化操作

③:@Temporal

一、第①组注解

  • @Entity 标注用于实体类声明语句之前,指出该Java 类为实体类,将映射到指定的数据库表。如声明一个实体类 Customer,它将映射到数据库中的 customer 表上。
  • @Table,当实体类与其映射的数据库表名不同名时需要使用 @Table 标注说明,该标注与 @Entity 标注并列使用,置于实体类声明语句之前,可写于单独语句行,也可与声明语句同行。 @Table 标注的常用选项是 name,用于指明数据库的表名

  • @Id 标注用于声明一个实体类的属性映射为数据库的主键列。该属性通常置于属性声明语句之前,可与声明语句同行,也可写在单独行上。 @Id标注也可置于属性的getter方法之前

  • @GeneratedValue  用于标注主键的生成策略,通过 strategy 属性指定。默认情况下,JPA 自动选择一个最适合底层数据库的主键生成策略:SqlServer 对应 identity,MySQL 对应 auto increment。

在 javax.persistence.GenerationType 中定义了以下几种可供选择的策略:

—— IDENTITY:采用数据库 ID自增长的方式来自增主键字段,Oracle 不支持这种方式;

—— AUTO: JPA自动选择合适的策略,是默认选项

—— SEQUENCE:通过序列产生主键,通过 @SequenceGenerator 注解指定序列名,MySql 不支持这种方式

—— TABLE:通过表产生主键,框架借由表模拟序列产生主键,使用该策略可以使应用更易于数据库移植(TABLE生成主键将会在后面详细讲解)。

  • @Basic 表示一个简单的属性到数据库表的字段的映射,对于没有任何标注的 getXxxx() 方法,默认即为@Basic

—— fetch: 表示该属性的读取策略,有 EAGER 和 LAZY 两种,分别表示主支抓取和延迟加载,默认为 EAGER.

—— optional: 表示该属性是否允许为null, 默认为true

  • @Column,当实体的属性与其映射的数据库表的列不同名时需要使用此注解说明,该属性通常置于实体的属性声明语句之前,还可与 @Id 标注一起使用。

—— name 属性,用于设置映射数据库表的列名。此外,该标注还包含其它多个属性,如:unique 、nullable、length 等。

—— columnDefinition 属性: 表示该字段在数据库中的实际类型

a、通常 ORM 框架可以根据属性类型自动判断数据库中字段的类型,但是对于Date类型仍无法确定数据库中字段类型究竟是DATE,TIME还是TIMESTAMP。

      b、此外,String的默认映射类型为VARCHAR, 如果要将 String 类型映射到特定数据库的 BLOB 或TEXT 字段类型。

—— @Column 标注也可置于属性的getter方法之前

二、第②组注解

  • 表示该属性并非一个到数据库表的字段的映射,ORM框架将忽略该属性。其作用类似于序列化中的@Transient注解
  • 如果一个属性并非数据库表的字段映射,就务必将其标示为@Transient;否则,ORM框架默认其注解为@Basic

三、第③组注解

  • 在核心的 Java API 中并没有定义 Date 类型的精度(temporal precision)。而在数据库中,表示 Date 类型的数据有 DATE, TIME, 和 TIMESTAMP 三种精度(即单纯的日期,时间,或者两者 兼备). 在进行属性映射时可使用@Temporal注解来调整精度

四、接下来就是修改 2、JPA的HelloWorld 中的实体类Customer.java,将上面的注解都使用一遍,看看实际的效果:

  1 package com.magicode.jpa.helloworld;
  2 
  3 import java.util.Date;
  4 
  5 import javax.persistence.Column;
  6 import javax.persistence.Entity;
  7 import javax.persistence.GeneratedValue;
  8 import javax.persistence.GenerationType;
  9 import javax.persistence.Id;
 10 import javax.persistence.Table;
 11 import javax.persistence.Temporal;
 12 import javax.persistence.TemporalType;
 13 import javax.persistence.Transient;
 14 
 15 /**
 16  * @Entity 用于注明该类是一个实体类
 17  * @Table(name="t_customer") 表明该实体类映射到数据库的 t_customer 表
 18  */
 19 @Table(name="t_customer")
 20 @Entity
 21 public class Customer {
 22 
 23     private Integer id;
 24     private String lastName;
 25 
 26     private String email;
 27     private int age;
 28     
 29     private Date birthday;
 30     
 31     private Date createdTime;
 32 
 33     /**
 34      * @GeneratedValue(strategy=GenerationType.AUTO) 指明主键生成策略为AUTO
 35      * @Id 表明实体类的主键
 36      */
 37     @GeneratedValue(strategy=GenerationType.AUTO)
 38     @Id
 39     public Integer getId() {
 40         return id;
 41     }
 42 
 43     /**
 44      * @Column 指明lastName属性映射到表的 LAST_NAME 列中
 45      * 同时还可以指定其长度、能否为null等数据限定条件
 46      */
 47     @Column(name="LAST_NAME", length=50, nullable=false)
 48     public String getLastName() {
 49         return lastName;
 50     }
 51     
 52     /**
 53      * 利用 @Temporal 来限定birthday为DATE型
 54      */
 55     @Column(name="birthday")
 56     @Temporal(TemporalType.DATE)
 57     public Date getBirthday() {
 58         return birthday;
 59     }
 60 
 61     /*
 62      * 通过 @Column 的 columnDefinition 属性将CREATED_TIME列
 63      * 映射为“DATE”类型
 64      */
 65     @Column(name="CREATED_TIME", columnDefinition="DATE")
 66     public Date getCreatedTime() {
 67         return createdTime;
 68     }
 69     
 70     /*
 71      * 通过 @Column 的 columnDefinition 属性将email列
 72      * 映射为“TEXT”类型
 73      */
 74     @Column(columnDefinition="TEXT")
 75     public String getEmail() {
 76         return email;
 77     }
 78     
 79     /*
 80      * 工具方法,不需要映射为数据表的一列
 81      */
 82     @Transient
 83     public String getInfo(){
 84         return "lastName: " + lastName + " email: " + email;
 85     }
 86 
 87     public int getAge() {
 88         return age;
 89     }
 90 
 91     public void setId(Integer id) {
 92         this.id = id;
 93     }
 94 
 95     public void setLastName(String lastName) {
 96         this.lastName = lastName;
 97     }
 98 
 99     public void setEmail(String email) {
100         this.email = email;
101     }
102 
103     public void setAge(int age) {
104         this.age = age;
105     }
106 
107     public void setBirthday(Date birthday) {
108         this.birthday = birthday;
109     }
110 
111     public void setCreatedTime(Date createdTime) {
112         this.createdTime = createdTime;
113     }
114     
115 }

在main方法中的测试不变,只是在持久化customer的时候添加两行代码:

// 4、调用EntityManager的persist方法完成持久化过程
Customer customer = new Customer();
customer.setAge(9);
customer.setEmail("Tom@163.com");
customer.setLastName("Tom");
//添加1
customer.setBirthday(new Date());
//添加2
customer.setCreatedTime(new Date());
em.persist(customer);

对Customer.java做如下几点说明总结

①、对getInfo()方法作为一个工具方法,不需要映射到数据库中。所以,使用了@Transient,表示在持久化的时候忽略它。否则,JPA会默认getInfo方法使用了默认的@Basic注解,而将其持久化到数据库的info列中

②、getBirthday()方法上使用了@Temporal(TemporalType.DATE)注解,表明在持久化过程中将birthday对应的数据存为DATE(即只有“年月日”)。

同样的效果体现在getCreatedTime方法上。虽然该方法没有使用@Temporal注解,但是@Column(name="CREATED_TIME", columnDefinition="DATE")

指明了“映射数据库列名为CREATED_TIME”、“对应列的数据类型为DATE型”

③、在getEmail()方法上使用了@Column(columnDefinition="TEXT"),指明email这一列的数据类型为“TEXT”(在存放大文本的时候使用)

④、从②和③可以看出,columnDefinition的取值就可以直接使用数据库原生的类型名字即可

⑤、如果没有使用@Column的name属性指定映射的列名,那么默认的命名方法为getter规则:getXxx对应的名字为xxx(也就是第一个字母变小写得到)

运行main方法以后建立的数据库如下:

再看看表的结构:

转载于:https://www.cnblogs.com/lj95801/p/5002356.html

相关文章:

实战域树部署,Active Directory系列之十九

实战子域部署<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />域树是Active Directory针对NT4的传统域模型所进行的重要改进。在NT4时代的域模型中&#xff0c;每个域都要使用没有层次结构的NETBIOS名称&#xff0c;而且域和域之…

黑科技抗疫,Python开发者大集结!

2020年初&#xff0c;突如其来的新型冠状病毒肺炎打乱了所有人的节奏&#xff0c;但社会各界迅速团结起来&#xff0c;为抗击疫情贡献出自己的力量。除了捐款捐物外&#xff0c;很多科技公司运用5G、大数据、AI、云计算等新互联网技术&#xff0c;以科技的手段助力抗疫&#xf…

Inplayable技术分享

Inplayable技术分享运维设计模式Web安全工具语言python运维 《aws lambda 通过codebuild上线踩坑指南之 lambda 进程被占用 status error 255》《google pay 配置sub/pub回调》《AWS攻略——使用CodeCommit托管代码》《AWS攻略——使用S3托管静态网页》《AWS攻略——使用CodeB…

将数组A中的内容和数组B中的内容进行交换(数组一样大)

#include <stdio.h>int main() {int arr1[10]{1,2,3,4,5,11,14,16,17,12};int arr2[10]{0,6,7,8,9,15,21,18,19,13};int arr3[10];int i0;for(i0;i<sizeof(arr1)/sizeof(arr1[0]);i){arr3[i]arr1[i];arr1[i]arr2[i];arr2[i]arr3[i];//不定义第三个变量的两种种方法&am…

***必备工具

***必备工具一、扫描工具 X-scan 3.1 焦点出的扫描器&#xff0c;国内最优秀的安全扫描软件之一!非常专业的一个扫描器! X-way 2.5 这也上一个非常不错的扫描器哦!功能非常多!使用也不难,***必备工具! SuperScan 3.0 强大的TCP 端口扫描器、Ping 和域名解析器! Namp 3.5 这个就…

通过评估假设行为来学习人类目标

来源| deepmind编译| 武明利&#xff0c;责编| Carol出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;当我们在现实世界中训练强化学习&#xff08;RL&#xff09;代理时&#xff0c;我们不会希望它们探索不安全的状态&#xff0c;例如将一个移动机器人开进…

ReactiveCocoa入门-part2

ReactiveCocoa是一个框架&#xff0c;它能让你在iOS应用中使用函数响应式编程&#xff08;FRP&#xff09;技术。在本系列教程的第一部分中&#xff0c;你学到了如何将标准的动作与事件处理逻辑替换为发送事件流的信号。你还学到了如何转换、分割和聚合这些信号。 在本系列教程…

VirtualBox虚拟机安装RedHat7.3编译Linux0.01内核

引子 由于需要编译linux0.01内核&#xff0c;而目前的linux版本太高需要降低gcc版本等等&#xff0c;需要做不少调整非常不方便。 所以&#xff0c;直接安装RedHat7.3&#xff0c;这样就好编译linux0.01的内核了。 但是&#xff0c;安装RedHat7.3需要注意一些问题。 下载老…

远程办公是巨头游戏?十倍扩容,他们如何做到百万级并发流量

疫情发生后&#xff0c;除了Zoom这样深耕视频会议多年的软件&#xff0c;钉钉、企业微信、飞书等一大批互联网巨头也开通了免费服务&#xff0c;凭借着自身庞大的资源四处招揽用户。 据说&#xff0c;远程办公工具是2020年的第一个风口。 疫情发生后&#xff0c;除了Zoom这样深…

linux下使用sort命令升序、降序、随机及组合方式排序方法

示例文件&#xff1a;####################################################序号 优先级 字段1 字段21 5 abc def2 5 ae3 wff6 4 l…

mysql数据库备份、恢复文档

说明:为了加强线上数据库安全&#xff0c;避免研发人员误操作造成数据的丢失&#xff0c;制作本文档。一线运维人员可以参考!一、数据备份&#xff1a;专用数据库备份服务器&#xff0c;定时对数据库进行热备、冷备&#xff0c;即主从设置、mysqldump冷备、mysql-bin-log日志备…

Linux环境ddd安装与使用

ddd是一个优秀的调试器&#xff0c;安装ddd破费周折 必须安装x开发环境 1.下载 http://ftp.gnu.org/gnu/ddd/&#xff0c;下载最新的ddd-3.3.12.tar.gz # wget http://ftp.gnu.org/gnu/ddd/ddd-3.3.12.tar.gz # tar zxvf ddd-3.3.12.tar.gz # cd ddd-3.3.12/ 2.配置 # ./…

华为诺亚、北大提出GhostNet​,使用线性变换生成特征图,准确率超MobileNet v3 | CVPR 2020...

作者 | Kai Han, Yunhe Wang等编译 | Conv出品 | AI科技大本营&#xff08;rgznai100&#xff09;受限于内存空间和计算资源&#xff0c;将卷积神经网络部署到嵌入式设备中会比较困难。CNNs中特征图的冗余性是保证其成功的关键&#xff0c;但是在神经网络的结构设计中却鲜有研究…

pap和chap交叉认证

pap和chap交叉认证&#xff1a;R1启动pap&#xff0c;R2启动chap。R1上的配置&#xff1a;Router>enRouter#config tRouter(config)#enable s ciacoRouter(config)#line c 0Router(config-line)#pass ciacoRouter(config-line)#loginRouter(config-line)#logging syRouter(c…

如何在App中实现朋友圈功能之二快速实现用户信息的自定义——箭扣科技Arrownock...

如何在App中实现朋友圈功能之二快速实现用户信息的自定义自我关联社交元素&#xff1a;anSocial中很多的社交元素API&#xff0c;如帖子&#xff08;Post&#xff09;、相册&#xff08;Album&#xff09;、文件&#xff08;File&#xff09;等&#xff0c;这些API的可选参数中…

使用cat /proc/进程id/maps 查看进程内存映射

proc/<PID>/maps 查看进程的虚拟地址空间是如何使用的。 该文件有6列&#xff0c;分别为&#xff1a; 地址&#xff1a;库在进程里地址范围 权限&#xff1a;虚拟内存的权限&#xff0c;r读&#xff0c;w写,x,s共享,p私有&#xff1b; 偏移量&#xff1a;库在进程里地址范…

两成开发者月薪超 1.7 万、算法工程师最紧缺! | 中国开发者年度报告

整理 | 郭芮 责编 | 唐小引 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; “求知若饥&#xff0c;虚心若愚”——这个原本出自《全球概览》的俳句&#xff0c;因为乔布斯在斯坦福大学毕业演讲中的引用而备受推崇&#xff0c;流传成为 IT 界的至理名言之一。在…

怎么处理404 错误页面 、处理404页面、asp.net 处理404页面

说明 On 指定启用自定义错误。如果未指定 defaultRedirect&#xff0c;用户将看到一般性错误。 Off 指定禁用自定义错误。这允许显示标准的详细错误。 RemoteOnly 指定仅向远程客户端显示自定义错误并且向本地主机显示 ASP.NET 错误。这是默认值。 system.web 元素 下添加下边…

转载:python原生态的输入窗口抖动+输入特效

python原生态的输入窗口抖动输入特效 出处&#xff1a;https://coding.net/u/acee/p/PythonPowerInput/git/blob/master/test_power_input.py __author__ Administrator import sys from lib.qm_app import App from PyQt4.QtGui import * from PyQt4.QtCore import * import …

华为提出基于进化算法和权值共享的神经网络结构搜索,CIFAR-10上仅需单卡半天 | CVPR 2020...

作者 | VincentLee来源 | 晓飞的算法工程笔记导读&#xff1a;为了优化进化算法在神经网络结构搜索时候选网络训练过长的问题&#xff0c;参考ENAS和NSGA-III&#xff0c;论文提出连续进化结构搜索方法(continuous evolution architecture search, CARS)&#xff0c;最大化利用…

在.Net Micro Framework中显示汉字

摘要:MF平台支持的字体是专有格式&#xff0c;扩展名为tinyfnt&#xff0c;需要用专门的转化工具才能把windows平台上的字体转换为tinyfnt字体。在.Net Micro Framework SDK中提供了一个叫做TFConvert.exe的工具&#xff0c;我们可以用它在命令行下将PC机上的TrueType或者OpenT…

汇编语言使用C库函数和Linux动态链接

使用printf 代码 #cpuid2.s -- Using C labrary calls .section .data output: .asciz "The processor Vender is %s\n".section .bss .lcomm buffer, 12 .section .text .globl _start _start: movl $0, %eax cpuid …

springJDBC实现查询方法二

无废话&#xff0c;看代码&#xff1a; Overridepublic List<Sites> queryAllSites(Pager pager) {String sql "select * from sakai_site order by SITE_ID limit ?,?";Object[] obj new Object[]{pager.getStart(),pager.getLimit()};List<Sites> …

全球计算机视觉顶会CVPR 2020论文出炉:腾讯优图17篇论文入选

全球计算机视觉顶级会议CVPR2020 (IEEE Conference on Computer Vision and Pattern Recognition&#xff0c;即IEEE国际计算机视觉与模式识别会议) 即将于2020年6月14日-19日在美国西雅图召开。本届大会总共录取来自全球论文1470篇&#xff0c;腾讯优图实验室入选17篇。 作为…

gcc使用总结

1.基本选项 -o 指定输出文件名。如果不给出这个选项&#xff0c;gcc就给出预设的可执行文件a.out。 # cc -o XX XX.c -c 编译、汇编到目标代码&#xff0c;不进行链接 -v 打印较多信息&#xff0c;显示编译器调用的程序。 -E 仅作预处理&#xff0c;不进行编译、汇编…

websecurity - Web Security Testing Framework 超级牛B扫描器

Windows – Websecurify 0.3.exehttp://websecurify.googlecode.com/files/Websecurify%200.3.exeLinux – Websecurify 0.3.tgzhttp://websecurify.googlecode.com/files/Websecurify%200.3.tgzMac – Websecurify 0.3.dmghttp://websecurify.googlecode.com/files/Websecurif…

C中的qsort函数和C++中的sort函数的理解与使用

一、qsort()函数 原型&#xff1a;_CRTIMP void __cdecl qsort (void*, size_t, size_t,int (*)(const void*, const void*)); 参数解释&#xff1a;1、待排序数组首地址&#xff1b;2、数组中待排序元素数量&#xff1b;3、各元素的占用空间的大小&#xff1b;4、指向函数的指…

机器学习新闻综述:2019年AI领域不得不看的6篇文章

作者 | Limarc Ambalina翻译 | 火火酱&#xff0c;编辑 | Carol出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;在这篇机器学习新闻综述中&#xff0c;我们将回顾一些2019年以来在人工智能各个领域广泛传播或产生影响的重大新闻。此外&#xff0c;我们还将…

GDB attach到进程

要调试守护进程等已经启动的进程或是调试陷于死循环的进程可以使用attach命令 格式 attach pid C语言代码 #include <stdio.h> int main(void) { int marks[10]; int i; for(i0;i<12;i) { scanf("%d",&marks[i]); …

Chrome使用技巧和编辑框拖动怪问题。

常用快捷键&#xff1a;ctrlshiftt 重新打开刚关闭的网页ctrlh 打开历史记录ctrl 放大。ShiftEscape 查看任务管理器据说Chrome能调整编辑区大小&#xff0c;我没发现。倒发现Chrome一个问题&#xff0c;选中编辑框中的文字&#xff0c;一直拖动鼠标&a…