参考文章:https://blog.csdn.net/mr_doudo/article/details/79380642
@javax.persistence.Entity(name="xxx")
name指定实体Bean的名称,默认值为 bean class 的非限定类名(不带包的短类名)
@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"})}
@javax.persistence.Id()
映射到数据库表的主键的属性,一个实体只能有一个属性被映射为主键.
@javax.persistence.GeneratedValue(generator="xxx",strategy=GenerationType.AUTO)
strategy:表示主键生成策略,有
方式一:@GeneratedValue(strategy=GenerationType.AUTO) 默认策略,生成方式取决于底层的数据库。
方式二:@GeneratedValue(strategy = GenerationType.IDENTITY)指定“自动增长”策略,适用于MySQL。
方式三:@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq_tbl_user")
指定“序列”策略,适用于Oracle。其中generator表示生成器的名字,这个属性通常和ORM框架相关。
例如,Hibernate可以指定uuid等主键生成方式(要和@SequenceGenerator(name = "seq_tbl_user",
sequenceName = "seq_tbl_user", allocationSize = 1)注解配合使用,其中name指定生成器的名
字(与generator的值一样),sequenceName指定数据库中定义序列的名字,allocationSize指定序
列每次增长1 )
方式四:@GeneratedValue(strategy=GenerationType.TABLE) 使用一个特定的数据库表格来保存主键
@javax.persistence.Basic(fetch=FetchType.LAZY,optional=true)
fetch=FetchType.EAGER 即时加载(默认值,即不写Basic注释的默认值)
fetch=FetchType.LAZY 惰性加载
optional:指定在生成数据库结构时字段是否允许为 null,(默认值为true,允许为空)
@javax.persistence.Column(length=15,nullable=false,columnDefinition="",
insertable=true,scale=10,table="",updatable=true)
@Column 注解指定字段的详细定义
name: 数据库字段的名称,默认与属性名称一致
nullable: 是否允许为null,默认为true
unique: 是否唯一,默认为false
length: 字段的长度,仅对String类型的字段有效
columnDefinition: 表示该字段在数据库中的实际类型,通常ORM框架根据属性类型自动判断数据库中字段的类型,
例如:
String的默认映射类型为VARCHAR, 如果要将String类型映射到特定数据库的BLOB或TEXT字段类型,
该属性非常有用
如: @Column(name="BIRTH",nullable="false",columnDefinition="TEXT")
insertable:
默认情况下,JPA假设所有列始终包含在 SQL INSERT 语句中。
如果该列不应包含在这些语句中,请将 insertable 设置为 false
updatable:
默认情况下,JPA假设所有列始终包含在 SQL UPDATE 语句中。
如果该列不应包含在这些语句中,请将 updatable 设置为 false
table:
当实体类使用 @SecondaryTable注解时会保存于多张表中,
该字段指定实体类中的某个属性保存于到那张表,不设置时该属性,默认保存到与类名相同的默认表中。
@javax.persistence.Temporal(TemporalType.DATE)
方式一:@Temporal(TemporalType.DATE)映射为日期(只有日期)
方式二:@Temporal(TemporalType.TIME)映射为日期(只有时间)
方式三:@Temporal(TemporalType.TIMESTAMP)映射为日期(日期+时间)
@javax.persistence.Enumerated(EnumType.STRING)
枚举类型成员属性映射
EnumType.STRING指定属性映射为字符串。
EnumType.ORDINAL指定属性映射为数据序。
@javax.persistence.Lob
用于标注数据库中字段类型为Clob和Blob类型(大数据类型)
Clob(Character Large Ojects)类型是长字符串类型,实体的类型可为char[]、Character[]、或者String类型
Blob(Binary Large Objects)类型是字节类型,实体的类型可为byte[]、Byte[]、或者实现了Serializable接口的类。
大数据类型,通常使用惰性加载的方式, @Basic(fetch=FetchType.LAZY)
(10)Transient
@javax.persistence.Transient
@Transient表示该属性并非一个到数据库表的字段的映射,不会被ORM框架初始化,ORM框架将忽略该属性
(11)SecondaryTable
@javax.persistence.SecondaryTable
将一个实体映射到多个数据库表中,例如:
@Entity
@SecondaryTables({ @SecondaryTable(name = "Address"), @SecondaryTable(name = "Comments") })
public class Forum implements Serializable {
@Column(table = "Address")
private String street;
@Column(table = "Address")
private String city;
@Column(table = "Address")
private String conutry;
@Column(table = "Comments")
private String title;
@Column(table = "Comments")
private String Comments;
@Column(table = "Comments")
}
table属性的值指定属性存储的哪张数据库表。
没有用 @Column中table值 注解改变的属性,将会存在于默认和类名相同的 Forum 表中。
(12)@Embeddable
@javax.persistence.Embeddable
嵌套映射,在被嵌套的类中使用Embeddable注解,说明这个就是一个可被嵌套的类,使用 @Embedded
当同一个类被不同的注解方式的类嵌套时,可能会出现一些错误,使用 @Access(AccessType. FIELD)设定被嵌套类的注解方式
(13)OneToOne
@OneToOne(fetch=FetchType,cascade=CascadeType)
描述一个单向一对一的关联关系
fetch:表示抓取策略,默认为FetchType.LAZY
cascade:表示默认的级联操作策略
(14)OneToMany
@OneToMany(fetch=FetchType,cascade=CascadeType)
描述一个单向一对多的关联,该属性应该为集体类型,在数据库中并没有实际字段.
fetch:表示抓取策略,默认为FetchType.LAZY
cascade:表示级联操作策略,对于OneToMany类型的关联非常重要,通常该实体更新或删除时,其关联的实体也应当被更新或删除
(15)ManyToOne
@ManyToOne(fetch=FetchType,cascade=CascadeType)
表示一个单向多对一的映射,该注解标注的属性通常是数据库表的外键
fetch:表示抓取策略,默认为FetchType.EAGER
cascade:表示默认的级联操作策略,可以指定为ALL,PERSIST,MERGE,REFRESH和REMOVE中的若干组合,默认为无级联操作
(16)ManyToMany
@ManyToMany
@ManyToMany 描述一个多对多的关联.多对多关联上是两个一对多关联,但是在ManyToMany描述中,中间表是由ORM框架自动处理
targetEntity:表示多对多关联的另一个实体类的全名,例如:package.Book.class
mappedBy:表示多对多关联的另一个实体类的对应集合属性名称
示例:
User实体表示用户,Book实体表示书籍,为了描述用户收藏的书籍,可以在User和Book之间建立ManyToMany关联
(17)JoinColumn
@JoinColumn(name=name)
@JoinColumn和@Column类似,不同是它描述的不是一个简单字段,而一一个关联字段,例如描述一个@ManyToOne的字段
name:该属性在数据库中字段的名称.由于@JoinColumn描述的是一个关联字段,默认值为:实体的名称+下划线+实体的主键名称。
(18)Query
@Query("JPQL语句")在repository中自定义查询方法,使用JPQL语句
@Query(nativeQuery = true,value = "SQL语句")
nativeQuery:设置为true表示可以本地查询,即在value中使用原生SQL语句查询。默认值:false
value :原生SQL语句
(19)Modifying
@Modifying注解与@Query一起使用表示将查询操作标识为修改查询,这样框架最终会生成一个更新的操作,而非查询
(20)Transactional
@Transactional:spring整合JPA时用于注释事务。
(21)persistencecontext
@persistencecontext: spring整合JPA时在dao层,用于注释产生与当前线程事务相关的 EntityManager。
例: @PersistenceContext
private EntityManager em;
(22)验证注解
注解 |
适用类型 |
说明 |
示例 |
@Pattern |
String |
通过正则表达式来验证字符串 |
@attern(regex=”[a-z]{6}”) |
@Length |
String |
验证字符串的长度 |
@length(min=3,max=20) |
|
String |
验证一个Email地址是否有效 |
|
@Range |
Long |
验证一个整型是否在有效的范围内 |
@Range(min=0,max=100) |
@Min |
Long |
验证一个整型必须不小于指定值 |
@Min(value=10) |
@Max |
Long |
验证一个整型必须不大于指定值 |
@Max(value=20) |
@Size |
集合或数组 |
集合或数组的大小是否在指定范围内 |
@Size(min=1,max=255) |
以上每个注解都可能性有一个message属性,用于在验证失败后向用户返回的消息,还可以同个属性上使用多个注解