8.5. 声明大字段
@Lob
:声明某个字段为大字段。
@Lob private String content;
更详细的声明:
@Lob //指定 Lob 类型数据的获取策略, FetchType.EAGER 表示非延迟加载,而 FetchType.LAZY 表示延迟加载 ; @Basic(fetch = FetchType.EAGER) //columnDefinition 属性指定数据表对应的 Lob 字段类型 @Column(name = "content", columnDefinition = "LONGTEXT NOT NULL") private String content;
8.6. 创建枚举类型的字段
可以使用枚举类型的字段,不过枚举字段要用@Enumerated
注解修饰。
public enum Gender { MALE("男性"), FEMALE("女性"); private String value; Gender(String str){ value=str; } }
@Entity @Table(name = "role") public class Role { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; private String description; @Enumerated(EnumType.STRING) private Gender gender; 省略getter/setter...... }
数据库里面对应存储的是 MALE/FEMALE。
8.7. 增加审计功能
只要继承了 AbstractAuditBase
的类都会默认加上下面四个字段。
@Data @AllArgsConstructor @NoArgsConstructor @MappedSuperclass @EntityListeners(value = AuditingEntityListener.class) public abstract class AbstractAuditBase { @CreatedDate @Column(updatable = false) @JsonIgnore private Instant createdAt; @LastModifiedDate @JsonIgnore private Instant updatedAt; @CreatedBy @Column(updatable = false) @JsonIgnore private String createdBy; @LastModifiedBy @JsonIgnore private String updatedBy; }
我们对应的审计功能对应地配置类可能是下面这样的(Spring Security 项目):
@Configuration @EnableJpaAuditing public class AuditSecurityConfiguration { @Bean AuditorAware<String> auditorAware() { return () -> Optional.ofNullable(SecurityContextHolder.getContext()) .map(SecurityContext::getAuthentication) .filter(Authentication::isAuthenticated) .map(Authentication::getName); } }
简单介绍一下上面涉及到的一些注解:
@CreatedDate: 表示该字段为创建时间字段,在这个实体被 insert 的时候,会设置值
@CreatedBy :表示该字段为创建人,在这个实体被 insert 的时候,会设置值
@LastModifiedDate、@LastModifiedBy同理。
@EnableJpaAuditing:开启 JPA 审计功能。
8.8. 删除/修改数据
@Modifying 注解提示 JPA 该操作是修改操作,注意还要配合@Transactional注解使用。
@Repository public interface UserRepository extends JpaRepository<User, Integer> { @Modifying @Transactional(rollbackFor = Exception.class) void deleteByUserName(String userName); }
8.9. 关联关系
@OneToOne
声明一对一关系@OneToMany
声明一对多关系@ManyToOne
声明多对一关系@MangToMang
声明多对多关系
更多关于 Spring Boot JPA 的文章请看我的这篇文章:一文搞懂如何在 Spring Boot 正确中使用 JPA 。
9. 事务 @Transactional
在要开启事务的方法上使用@Transactional
注解即可!
@Transactional(rollbackFor = Exception.class) public void save() { ...... }
我们知道 Exception 分为运行时异常 RuntimeException 和非运行时异常。在@Transactional注解中如果不配置rollbackFor属性,那么事务只会在遇到RuntimeException的时候才会回滚,加上rollbackFor=Exception.class,可以让事务在遇到非运行时异常时也回滚。
@Transactional 注解一般可以作用在类或者方法上。
作用于类:当把@Transactional 注解放在类上时,表示所有该类的 public 方法都配置相同的事务属性信息。
作用于方法:当类配置了@Transactional,方法也配置了@Transactional,方法的事务会覆盖类的事务配置信息。
更多关于 Spring 事务的内容请查看我的这篇文章:可能是最漂亮的 Spring 事务管理详解 。
10. json 数据处理
10.1. 过滤 json 数据
@JsonIgnoreProperties
作用在类上用于过滤掉特定字段不返回或者不解析。
//生成json时将userRoles属性过滤 @JsonIgnoreProperties({"userRoles"}) public class User { private String userName; private String fullName; private String password; private List<UserRole> userRoles = new ArrayList<>(); }
@JsonIgnore
一般用于类的属性上,作用和上面的@JsonIgnoreProperties
一样。
public class User { private String userName; private String fullName; private String password; //生成json时将userRoles属性过滤 @JsonIgnore private List<UserRole> userRoles = new ArrayList<>(); }
10.2. 格式化 json 数据
@JsonFormat
一般用来格式化 json 数据。
比如:
@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", timezone="GMT") private Date date;
10.3. 扁平化对象
@Getter @Setter @ToString public class Account { private Location location; private PersonInfo personInfo; @Getter @Setter @ToString public static class Location { private String provinceName; private String countyName; } @Getter @Setter @ToString public static class PersonInfo { private String userName; private String fullName; } }
未扁平化之前:
{ "location": { "provinceName":"湖北", "countyName":"武汉" }, "personInfo": { "userName": "coder1234", "fullName": "shaungkou" } }
使用@JsonUnwrapped
扁平对象之后:
@Getter @Setter @ToString public class Account { @JsonUnwrapped private Location location; @JsonUnwrapped private PersonInfo personInfo; ...... }
{ "provinceName":"湖北", "countyName":"武汉", "userName": "coder1234", "fullName": "shaungkou" }
11. 测试相关
@ActiveProfiles
一般作用于测试类上, 用于声明生效的 Spring 配置文件。
@SpringBootTest(webEnvironment = RANDOM_PORT) @ActiveProfiles("test") @Slf4j public abstract class TestBase { ...... }
@Test
声明一个方法为测试方法
@Transactional
被声明的测试方法的数据会回滚,避免污染测试数据。
@WithMockUser
Spring Security 提供的,用来模拟一个真实用户,并且可以赋予权限。
@Test @Transactional @WithMockUser(username = "user-id-18163138155", authorities = "ROLE_TEACHER") void should_import_student_success() throws Exception { ...... }
总结
OK,今天关于 Spring/SpringBoot 常用注解 的总结分享就到这里,希望本篇文章能够帮助到大家,同时也希望大家看后能学有所获!!!
好了,我们下期见~