部分常用注解整理
当项目变得比较大的时候,如何还使用hbm.xml文件来配置Hibernate实体就会变得比较复杂。这里Hibernate提供了Annotation注解方式,使得Hibernate的映射文件变得很方便管理了。
Dao层
@Repository
用于将数据访问层(DAO层)的类标识为Spring Bean。具体只需将该注解标注在DAO类上即可。同时,为了让Spring 能够扫描类路径中的类并识别出@Repository注解,需要在XML配置文件中启用Bean的自动扫描功能,这可以通过实现。
问:为什么@Repository只能标注在DAO?
答:这是因为该注解的作用不只是将类识别为Bean,同时它还能将所标注的类中抛出的数据访问异常封装为Spring的数据访问异常类型。
@Component
是一个泛化的概念,仅仅表示一个组件(Bean),可以作用在任何层次。默认Bean名称会是小写开头的非限定类名。
Service层
@Service
通常作用在业务层,但是目前该功能与@Component相同。
Controller层
@Controller
通常作用在控制层,但是目前该功能与@Component相同。
@RestController
@Valid
@RequestBody
@RequestMapping
@RequestMapping("/VIID/Face/add")
@PostMapping
@GetMapping
@RequiresAuthentication
验证用户是否登录,等同于方法subject.isAuthenticated() 结果为true时。
@RequiresUser
验证用户是否被记忆,user有两种含义:
一种是成功登录的(subject.isAuthenticated() 结果为true);
另外一种是被记忆的(subject.isRemembered()结果为true)。
@RequiresGuest
验证是否是一个guest的请求,与@RequiresUser完全相反。
换言之,RequiresUser == !RequiresGuest。
此时subject.getPrincipal() 结果为null.
@RequiresRoles
例如:@RequiresRoles(“aRoleName”);
void someMethod();
如果subject中有aRoleName角色才可以访问方法someMethod。如果没有这个权限则会抛出异常AuthorizationException。
@RequiresPermissions
例如: @RequiresPermissions({“file:read”, “write:aFile.txt”} )
void someMethod();
要求subject中必须同时含有file:read和write:aFile.txt的权限才能执行方法someMethod()。否则抛出异常AuthorizationException。
@Autowired和@Resource
PoJo
@Entity
方面 | 描述 |
---|---|
使用 | 用于类上方 |
作用 | 表明该类为实体类 |
注意 | 若该类名为UserEntity,其默认对应数据库中表名为user_entity |
@Table
方面 | 描述 |
---|---|
使用 | 用于类上方 |
作用 | 声明此对象映射到数据库的数据表。当实体类与其映射表名不同时,常与@Entity注解并列使用,置于实体类声明语句之前 |
属性说明如下:
- name:指明表名;
- catalog和schema:用于设置表所属的数据库目录和模式。
@Column
方面 | 描述 |
---|---|
使用 | 用于属性/get方法上方 |
作用 | 将成员属性映射到关系表中的哪一列和该列的结构信息 |
属性说明如下:
-
name:映射的列名。例如:映射tb_user表的name列,可用于name属性上面或getName方法上面;
-
unique:是否唯一;
-
nullable:是否允许为空;
-
length:对于字符型列,length属性指定列的最大字符长度;
-
insertable:是否允许插入;
-
updatetable:是否允许更新;
-
columnDefinition:定义建表时创建此列字段的DDL:
@Column(columnDefinition ="text")
-
secondaryTable:从表名。如果此列不建在主表上(默认是主表),该属性定义该列所在从表的名字。
@Id
方面 | 描述 |
---|---|
使用 | 用于属性/get方法上方 |
作用 | 指定表的主键 |
@GeneratedValue
方面 | 描述 |
---|---|
使用 | 用于属性/get方法上方 |
作用 | 指定主键生成方式。主键可以有多种生成方式 |
说明:
- TABLE:使用一个特定的数据库表格来保存主键。容器指定用底层的数据表确保唯一;
- SEQUENCE:根据底层数据库的序列来生成主键,条件是数据库支持序列。使用数据库的SEQUENCE列来保证唯一(Oracle数据库通过序列来生成唯一ID);
- IDENTITY:由数据库自动生成(主要是自动增长型)。使用数据库的IDENTITY列来保证唯一;
- AUTO:主键由程序控制。由容器挑选一个合适的方式来保证唯一;
- NONE:容器不负责主键的生成,由程序来完成。
举例:
@GeneratedValue(strategy = GenerationType.IDENTITY)
@JsonInclude
举例:
@JsonInclude(JsonInclude.Include.NON_NULL)
@Temporal
举例:
@Temporal(TemporalType.TIMESTAMP)
一对一、一对多、多对一、多对多
举例:
@OneToMany(fetch = FetchType.EAGER, mappedBy ="grayListReq", cascade = CascadeType.ALL)
@OneToOne(optional= true, mappedBy ="person", cascade = CascadeType.ALL)
@ManyToOne(fetch = FetchType.LAZY)
说明:
- FetchType.EAGER 表示非延迟加载
- FetchType.LAZY 表示延迟加载
@JoinColumn
举例:
@JoinColumn(name ="grayList_id", referencedColumnName ="id", nullable = false)
Jackson相关
@Transient
方面 | 描述 |
---|---|
使用 | 用于属性上方 |
作用 | 表示该属性并非一个到数据库表的字段的映射,ORM框架将忽略该属性 |
注意 | 如果一个属性并非表映射字段,就务必将其标示为@Transient,否则ORM框架默认其注解为@Basic |
举例:
// 表示该字段在数据库表中没有
@Transient
public int getAge() {
return 1+1;
}
@JsonIgnoreProperties
方面 | 描述 |
---|---|
使用 | 此注解是类注解 |
作用 | 在json序列化时,将java bean中的一些属性忽略掉,序列化和反序列化都受影响 |
@JsonIgnore
方面 | 描述 |
---|---|
使用 | 此注解用于属性或者方法上(最好是属性上) |
作用 | 和上面的@JsonIgnoreProperties一样 |
注意 | 问:若当表间有One2Many或Many2One时,会发生无限循环的场景,如何破? 答:只要在Set方法前增加以下注解即可。 |
@JsonFormat
方面 | 描述 |
---|---|
使用 | 此注解用于属性或者方法上(最好是属性上) |
作用 | 可以方便的把Date类型直接转化为我们想要的模式 |
举例:
@JsonFormat(pattern ="yyyy-MM-dd HH:mm:ss", timezone ="GMT+8")
@JsonSerialize
方面 | 描述 |
---|---|
使用 | 此注解用于属性或者getter方法上 |
作用 | 用于在序列化时嵌入我们自定义的代码,比如序列化一个double时在其后面限制两位小数点 |
@JsonDeserialize
方面 | 描述 |
---|---|
使用 | 此注解用于属性或者setter方法上 |
作用 | 用于在反序列化时可以嵌入我们自定义的代码,类似于上面的@JsonSerialize |
JAXB注解
@XmlRootElement
@XmlAccessorType
举例:
@XmlAccessorType(XmlAccessType.FIELD)
@JsonInclude
举例:
@JsonInclude(JsonInclude.Include.NON_NULL)
Unit基本注解
- @BeforeClass – 表示在类中的任意public static void方法执行之前执行
- @AfterClass – 表示在类中的任意public static void方法执行之后执行
- @Before – 表示在任意使用@Test注解标注的public void方法执行之前执行
- @After – 表示在任意使用@Test注解标注的public void方法执行之后执行
- @Test – 使用该注解标注的public void方法会表示为一个测试方法
参考博客:
https://www.cnblogs.com/hezhiyao/p/9440277.html