今天给大家介绍一下 jpa 实体类中的注解,希望能对大家有帮助。
基本注解@entity标注于实体类声明语句之前,指出该 java 类为实体类,将映射到指定的数据库表。
name(可选):实体名称。 缺省为实体类的非限定名称。该名称用于引用查询中的实体。不与 @table 结合时,表名默认为类名的 snakecase(蛇形命名法),若使用name属性,则表名为 name 值。
//以下三个类皆映射表名 student_info @entity public class studentinfo{...}@entity(name=student_info) public class studentinfo{...}@entity@table(name = 'student_info')public class studentinfo{...}@table当实体类与其映射的数据库表名不同名时需要使用@table标注说明,该标注与@entity标注并列使用,置于实体类声明语句之前。
name:用于指明数据库的表名。catalog、schema:用于设置表所属的数据库目录或模式,通常为数据库名。mysql不支持catalog,schema是数据库名。一般不需要设置。uniqueconstraints:用来批量命名唯一键,其作用等同于多个:@column(unique = true),一般不需要设置。@entity@table(name = student_info, uniqueconstraints = {@uniqueconstraint(columnnames = class_id)})public class studentinfo { @column(name = class_id) private string classid;}@basic(未加注解的默认注解)表示一个简单的属性到数据库表的字段的映射,对于没有任何注解的属性,默认即为 @basic 。
fetch: 表示该属性的读取策略,其中 eager (默认)表示立即加载,lazy 表示延迟加载。optional:表示该属性是否允许为 null ,默认为 true 。@transient表示该属性并非一个到数据库表的字段的映射,orm 框架将忽略该属性。如果一个属性并非数据库表的字段映射,就务必将其标示为@transient,否则,orm框架默认其注解为@basic 。@column当实体的属性与其映射的数据库表的列不同名时需要使用@column 标注说明,该注解通常置于实体的属性前或属性的getter方法之前,还可与 @id 标注一起使用。
name:用于设置映射数据库表的列名。unique:是否是唯一标识,默认为 false(不唯一)nullable:否允许为 null,默认为true(null)insertable:表示在 orm 框架执行插入操作时,该字段是否应出现 insert 语句中,默认为trueupdatable:表示在 orm 框架执行更新操作时,该字段是否应该出现在 update 语句中,默认为 true。对于一经创建就不可以更改的字段,该属性非常有用,如对于birthday字段。或者创建时间/注册时间(可以将其设置为 false 不可修改)。length:数据长度,仅对string类型的字段有效,默认值255precision、scale:表示精度,当字段类型为double时,precision表示数值的总长度,scale表示小数点所占的位数,默认值均为0。columndefinition:表示该字段在数据库中的实际类型。通常orm框架可以根据属性类型自动判断数据库中字段的类型,但是如果要将 string 类型映射到特定数据库的 blob 或 text 字段类型,该属性非常有用。@id用于声明一个实体类的属性映射为数据库的主键列。
@generatedvaluejpa通用策略生成器,通过 strategy 属性指定。定义了以下几种可供选择的策略: auto:jpa 自动选择合适的策略,是默认选项;identity:采用数据库 id自增长的方式来自增主键字段,oracle 不支持这种方式;sequence:通过序列产生主键,通过 @sequencegenerator 注解指定序列名,mysql 不支持这种方式table:通过表产生主键,框架借由表模拟序列产生主键,使用该策略可以使应用更易于数据库移植。该策略一般与另外一个注解一起使用@tablegenerator。默认情况下,jpa 自动选择一个最适合底层数据库的主键生成策略:sqlserver 对应 identity,mysql 对应 auto。generator:使用指定的主键生成器时,这里设置为生成器名称。@genericgenerator自定义主键生成策略
name:生成器名称strategy:预定义的 hibernate 策略或完全限定的类名。@data@entity@table(name = student_info)public class studentinfo { @id @column(name = id) @genericgenerator(name=idgenerator, strategy=uuid) @generatedvalue(generator = idgenerator) private string id; @transient private string age; @column(name = name) private string name;}其他注解@enumerated直接映射枚举类型的字段。
value: ordinal:映射到数据库字段为数字(默认)string:映射到数据库字段为字符串@entity@data@table(name = studentinfo)public class student { @column @enumerated private sex sex;}@temporal对于日期时间属性映射时,可使用 @temporal 注解来调整精度。
date:日期time:时间timestamp:日期时间@data@entity@table(name = student_info)public class student { @column @temporal(temporaltype.date) private date birthday;}@dynamicinsert、@dynamicupdate@dynamicinsert:设置为true,表示insert对象的时候,生成动态的insert语句,如果这个字段的值是null就不会加入到insert语句中。@dynamicupdate:设置为true,表示update对象的时候,生成动态的update语句,如果这个字段的值是null就不会被加入到update语句中。@data@entity@table(name = user_info)@dynamicinsert@dynamicupdatepublic class user { @id @column(name = id) @genericgenerator(name=idgenerator, strategy=uuid) @generatedvalue(generator = idgenerator) private string id; @column(name = name) private string name; @basic private integer age; @column(name = create_time) private long createtime; @column(name = remark) private string remark;}@access指定实体的访问模式(access mode),包括accesstype.field及accesstype.property。
accesstype.field: 字段访问(@column注解在属性上),通过字段来获取或设置实体的状态,getter和setter方法可能存在或不存在。这样jpa默认的访问类型为accesstype.field。accesstype.property: 属性访问(@column注解在get方法上),持久化属性必须有getter和setter方法,属性的类型由getter方法的返回类型决定,同时必须与传递到setter方法的单个参数的类型相同。这样jpa默认的访问类型为accesstype.property。复合主键@embeddedid + @embeddable当需要多个属性作为复合主键时,可以把该属性做为一个内部类嵌套在实体类中,使用@embeddedid + @embeddable实现:
@embeddedid:复合主键@embeddable:注释java类的,表示类是嵌入类: 必须要实现serializable接口需要有无参的构造函数// 复合主键类@data@embeddablepublic static class studentid implements serializable { @column(name = id) private integer id; @column(name = class_id) private integer classid;}//实体类@data@entity@table(name = student_info)public class studentinfo { @embeddedid private studentid studentid; @column(name = name) private string name;}@idclass注解复合主键的类,复合主键类必须满足:
实现serializable接口;有默认的public无参数的构造方法;重写equals和hashcode方法。// 复合主键类@data@embeddablepublic static class studentid implements serializable { @column(name = id) private integer id; @column(name = class_id) private integer classid;}//实体类@data@entity@idclass(studentid.class)@table(name = student_info)public class studentinfo { @embeddedid private studentid studentid; @column(name = name) private string name;}@embedded + @attributeoverride@embedded:注释属性的,表示该属性的类是嵌入类。@attributeoverrides:里面只包含了@attributeoverride类型数组。@attributeoverride:包含要覆盖的@embeddable类中字段名name和新增的@column字段的属性。// 复合主键类@data@embeddablepublic static class studentid implements serializable { private integer id; private integer classid;}@data@entity@table(name = student_info)public class studentinfo { @embedded @attributeoverrides( { @attributeoverride(name = id, column = @column(name = id)), @attributeoverride(name = classid, column = @column(name = class_id)) }) private studentid id; @column(name = name) private string name;}实体间关联关系@onetoone实体间一对一的关系。
fetch:立即加载和延迟加载cascade:当前类对象操作了之后,级联对象的操作。 remove:级联删除操作。删除当前实体时,与它有映射关系的实体也会跟着被删除。merge:级联更新(合并)操作。当前对象中的数据改变,会相应地更新级联对象中的数据。detach:级联脱管/游离操作。如果要删除一个实体,但是它有外键无法删除,你就需要这个级联权限了。它会撤销所有相关的外键关联。refresh:级联刷新操作。更新数据前先刷新对象和级联对象,再更新。persist:级联持久化(保存)操作。持久保存拥有方实体时,也会持久保存该实体的所有相关数据。all,当前类增删改查改变之后,关联类跟着增删改查,拥有以上所有级联操作权mappedby:拥有关联关系的域,如果关系是单向的就不需要,双向关系表,那么拥有关系的这一方有建立、解除和更新与另一方关系的能力,而另一方没有,只能被动管理,这 个属性被定义在关系的被拥有方。orphanremoval:如果设置为true,当关系被断开时,多方实体将被删除。否则会将对象的引用置为null。targetentity:表示该属性关联的实体类型。该属性通常不必指定,orm 框架根据属性类型自动判断。一对一关系的例子people 表(id,name,sex,birthday,address_id) address 表(id,phone,zipcode,address)
people和address是一对一的关系。
方式一:通过外键的方式(一个实体通过外键关联到另一个实体的主键)
@joincolum:保存表与表之间关系的字段,它要标注在实体属性上。一般修饰在主控方,用来定义一对一,一对多等关系列。
关联的实体的主键一般是用来做外键的。但如果此时不想主键作为外键,则需要设置referencedcolumnname属性。
@entitypublic class people { @id @column(name = id) @genericgenerator(name = idgenerator, strategy = uuid) @generatedvalue(generator = idgenerator) private string id; @column(name = name) private string name;//姓名 @column(name = sex) private string sex;//性别 @column(name = birthday) private date birthday;//出生日期 @onetoone(cascade=cascadetype.all)//people是关系的维护端,当删除 people,会级联删除 address @joincolumn(name = address_id, referencedcolumnname = id) private address address;//地址 }@entitypublic class address { @id @column(name = id) @genericgenerator(name = idgenerator, strategy = uuid) @generatedvalue(generator = idgenerator) private string id; @column(name = phone) private string phone;//手机 @column(name = zipcode) private string zipcode;//邮政编码 @column(name = address) private string address;//地址}方式二:通过关联表的方式来保存一对一的关系。
关联表:people_address (people_id,address_id)
@jointable:用于构建一对多,多对多时的连接表,默认会以主控表加下划线加反转表为表名。
joincolumns:该属性值可接受多个@joincolumn,用于配置连接表中外键列的信息,这些外键列参照当前实体对应表的主键列。inversejoincolumns:该属性值可接受多个@joincolumn,用于配置连接表中外键列的信息,这些外键列参照当前实体的关联实体对应表的主键列。@entitypublic class people { @id @generatedvalue(strategy = generationtype.identity) @column(name = id, nullable = false) private long id;//id @column(name = name) private string name;//姓名 @column(name = sex) private string sex;//性别 @column(name = birthday) private timestamp birthday;//出生日期 @onetoone(cascade=cascadetype.all)//people是关系的维护端 @jointable(name = people_address, joincolumns = @joincolumn(name=people_id), inversejoincolumns = @joincolumn(name = address_id)) private address address;//地址 }@entitypublic class address { @id @column(name = id) @genericgenerator(name = idgenerator, strategy = uuid) @generatedvalue(generator = idgenerator) private string id; @column(name = phone) private string phone;//手机 @column(name = zipcode) private string zipcode;//邮政编码 @column(name = address) private string address;//地址}@onetomany和@manytoone注解一对多和多对一关系。
jpa使用@onetomany和@manytoone来标识一对多的双向关联。一端(one)使用@onetomany,多端(many)使用@manytoone。在jpa规范中,一对多的双向关系由多端(many)来维护。就是说多端(many)为关系维护端,负责关系的增删改查。一端(one)则为关系被维护端,不能维护关系。一端(one)使用@onetomany注释的mappedby属性表明是关系被维护端。多端(many)使用@manytoone和@joincolumn来注释属性,@manytoone表明是多端,@joincolumn设置在表中的关联字段(外键)。例子
文章表 article (id,title,content,author_id)作者表 author (id,name)@entitypublic class author { @id @column(name = id) @genericgenerator(name = idgenerator, strategy = uuid) @generatedvalue(generator = idgenerator) private string id; @column private string name;//姓名 //级联保存、更新、删除、刷新;延迟加载。当删除用户,会级联删除该用户的所有文章 //拥有mappedby注解的实体类为关系被维护端 //mappedby=author中的author是article中的author属性 @onetomany(mappedby = author,cascade=cascadetype.all,fetch=fetchtype.lazy) private list articlelist;//文章列表} @entitypublic class article { @id @column(name = id) @genericgenerator(name = idgenerator, strategy = uuid) @generatedvalue(generator = idgenerator) private string id; @column private string title; @lob // 大对象,映射 mysql 的 long text 类型 @basic(fetch = fetchtype.lazy) // 懒加载 @column(nullable = false) private string content;//文章全文内容 //可选属性optional=false,表示author不能为空。删除文章,不影响用户 @manytoone(cascade={cascadetype.merge,cascadetype.refresh},optional=false) //设置在article表中的关联字段(外键) @joincolumn(name=author_id) private author author;//所属作者 }@manytomany注解多对多的关系。
角色和权限是多对多的关系。一个角色可以有多个权限,一个权限也可以被很多角色拥有。
jpa中使用@manytomany来注解多对多的关系,由一个关联表来维护。这个关联表的表名默认是:主表名+下划线+从表名。
这个关联表只有两个外键字段,分别指向主表id和从表id。字段的名称默认为:主表名+下划线+主表中的主键列名,从表名+下划线+从表中的主键列名。
例子
权限表 user_permission(id,permission_name)角色表 user_role(id,department_id, create_time, description, name, update_time)关联表 user_role_permission 表(role_id, permission_id)注意
多对多关系中一般不设置级联保存、级联删除、级联更新等操作。本例中,由于加了@jointable注解,关联关系表会按照注解指定的生成。否则去掉注解,指定role为关系维护端,所以生成的关联表名称为:user_role_permission,关联表的字段为:role_id 和permission_id。@data@entity@table(name = user_permission)public class permission implements comparable { @id @column(name = id) private string id; @column(name = permission_name) private string permissionname; @manytomany(mappedby=permissions) private set roles;}@data@entity@table(name = user_role)public class role { @id @column(name = id) @genericgenerator(name = idgenerator, strategy = uuid) @generatedvalue(generator = idgenerator) private string id; @column(name = create_time) private long createtime; @column(name = update_time) private long updatetime; @column(name = name) private string name; @column(name = description) private string description; @column(name = department_id) private string departmentid; @manytomany(fetch = fetchtype.eager, cascade = cascadetype.all) @jointable(name = user_role_permission, joincolumns = {@joincolumn(name = role_id)}, inversejoincolumns = {@joincolumn(name = permission_id)}) private list permissions;}小结以上就是 jpa 实体类中的注解介绍,文中的例子仅仅浅尝辄止,希望大家可以实际应用一下,后续我也会更深入的讲解一些 jpa 的高级用法。
壹传诚VR禁毒科普助力梁銶琚职校禁毒教育
简述保持电缆性能的方法
巴黎美学研究院神秘黑色华为P10海报曝光
酷冷至尊V系列升级为VGold金牌系列实现全面加强
Phil Spencer会透露更多有关下一代Xbox的信息
JPA实体类中的注解介绍
贾跃亭诉讼顾颖琼骚扰案败诉,预测会影响法拉第项目融资
Cosel推出40W DC/DC转换器MGF40——可靠性高,保修十年
基于arduino和机智云的实验室监测系统
INA轴承的表面和表面层质量介绍
塑胶件实现类似金属拉丝效果的三种工艺方法
分享一种用万用表去检测MOS管好坏的方法
谐波保护器设备ANHPD300
新唐科技M031LG6AE控制器
栅栏式接线端子产品介绍
跨境电商多元化发展在即,慧策旗下跨境ERP为商家护航
华为公布了2019年三季度经营业绩报告实现了销售收入6108亿人民币
通过采用AVR单片机ATXmega128A1进行便携式仪表的设计
路由器设计集成多种功能于一身,助力体验无线上网冲浪
台式电脑十大品牌:戴尔成铭系列 助力中国企业数字化变革