对象与数据库之间的转换
@Entity:标识实体类是JPA实体,告诉JPA在程序运行时生成实体类对应表
@Table:设置实体类在数据库所对应的表名
@Id:标识类里所在变量为主键
@GeneratedValue:设置主键生成策略,此方式依赖于具体的数据库
@Basic:表示简单属性到数据库表字段的映射
@Column:表示属性所对应字段名进行个性化设置
(1)name属性:被标注字段在数据库表中所对应字段的名称;
(2)length属性:表示该字段的长度,当字段的类型为varchar时,该属性才有效果,默认为255个字符;
(3)nullable属性:表示该字段是否可以为null值,默认是true。
(4)unique属性:表示该字段是否为唯一标识,默认fasle。
(5)precision和scale属性:precision属性和scale属性表示精度,当字段类型为double时,precision表示数值的总长度,scale表示小数点所占的位数。
@Transient:表示属性并非数据库表字段的映射,ORM框架将忽略该属性
@Temporal:
日期类型转换(参数 TemporalType.DATE()日期 TemporalType.TIME()时间T emporalType.TIMESTAMP()更精确的时间)
@Enumerated:
使用此注解映射枚举字段,以String类型存入数据库
注入数据库的类型有两种:EnumType.ORDINAL(Interger)、EnumType.STRING(String)
@Embedded、@Embeddable:
某一实体类存在属性的角色而又不需要成为表的话就用次注解
@Embeddable:注解在类上,标注此类可被其他类嵌套
@Embedded: 注解在属性上,表示嵌套被@Embeddable注解的同类型类
@ElementCollection:集合映射
当实体类包含多个相同类型的变量的时候就可以使用@ElementCollection来声明这个变量,而JPA会为此生成两个关联的表
场景: 数据库字段 对实体的某个属性描述,当这个属性 不能成为独立的存在的表时就需要这个注解的存在(比如:地址有;家庭地址和公司地址)
@CreatedDate
表示该属性为创建时间 (insert时候设置)
@CreatedBy
用户创建 字段(添加时设置)
@LastModifiedDate
最后修改的时间 字段(update自定设置)
@LastModifiedBy:(很重要)
最后修改用户字段(update自定设置)
关联关系
@OneToOne
@OneToOne注解说明:
(1)targetEntity 属性表示默认关联的实体类型,默认为当前标注的实体类;
(2)cascade 属性表示与此实体一对一关联的实体的联级样式类型。联级样式上当对实体进行操作时的策略。
说明:在定义关系时经常会涉及是否定义Cascade(级联处理)属性,担心造成负面影响. 不定义,则对关系表不会产生任何影响
①CascadeType.PERSIST (级联新建)
②CascadeType.REMOVE (级联删除)
③CascadeType.REFRESH (级联刷新)
④CascadeType.MERGE (级联更新)中选择一个或多个。
⑤还有一个选择是使用CascadeType.ALL ,表示选择全部四项
(3)fetch属性是该实体的加载方式,有两种:LAZY和EAGER。
(4)optional属性表示关联的实体是否能够存在null值。默认为true,表示可以存在null值。如果为false,则要同时配合使用@JoinColumn标记。
(5)mappedBy属性用于双向关联实体时,标注在不保存关系的实体中。
@OneToMany
例如一个公司对应多个部门,可以通过公司获取到其下面的多个部门信息。即公司表与部门表之间是一对多的关系;@OneToMany注解说明
(1)targetEntity属性表示默认关联的实体类型,默认为当前标注的实体类;因为一对多的实体集合时保存在集合类中,因此必须指明集合类中保存的具体类型。
(2)mappedBy属性用于双向关联实体时使用。
@JoinColumn
@JoinColumn(name=”loginId”):在一对一关系时:本表中指向另一个表的外键。一对多关系时:另一个表指向本表的外键。该注解属性详细说明:
(1)name属性是用来标记表中对应的字段的名称。如果不设置name的值,默认情况下,name的取值规则如下:
name=关联的表的名称 + “_” + 关联表主键的字段名
(2)默认情况下,关联的实体的主键一般用来做外键的。如果不想用主键作为外键,则需要设置referencedColumnName属性,如@JoinColumn(name=“address_id”, referencedColumnName=“ref_id”)
【注意】@JoinColumn可以与@OneToOne、@ManyToOne或@ManyToMany标记同时使用。
1)一对一和多对一的@JoinColumn注解的都是在“主控方”,都是本表指向外表的外键名称。
2)一对多的@JoinColumn注解在“被控方”,即一的一方,指的是外表中指向本表的外键名称。
3)多对多中,joinColumns写的都是本表在中间表的外键名称,inverseJoinColumns写的是另一个表在中间表的外键名称。
@JoinTable
@JoinTable中间表注解属性说明:
(1)name属性为连接两个表的表名称。若不指定,则使用默认的表名称,格式如下: “表名1” + “_” + “表名2”
(2)joinColumn属性表示,在保存关系的表中,所保存关联关系的外键的字段,并配合@JoinColumn标记使用;
(3)inverseJoinColumn属性与joinColumn类似,它保存的是保存关系的另外一个外键字段;
(4)catalog和schema属性表示实体指定点目录名称或数据库名称;
(5)uniqueConstraints属性表示该实体所关联的唯一约束条件,一个实体可以有多个唯一约束条件,默认没有约束;
@JoinTable(name = "SysUserRole", joinColumns = {@JoinColumn(name = "uid")}, inverseJoinColumns = {@JoinColumn(name = "roleId")})
private List<SysRole> roleList;// 一个用户具有多个角色