Spring Data JPA 常用注解

1. 创建表

@Entity声明该类对应一个数据表实体(万事万物皆为对象)。

@Table 设置表名

@Entity
@Table(name = "user")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    省略getter/setter......
}

2. 创建主键

@Id :声明一个字段为主键。

使用@Id声明之后,可以使用 @GeneratedValue 指定主键生成策略。

使用 @GeneratedValue 指定主键生成策略的方式有两种:

1. 通过 @GeneratedValue 可以直接使用 JPA 内置提供的四种主键生成策略来指定主键生成策略。

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

JPA 使用枚举定义了 4 中常见的主键生成策略:

  • TABLETABLE:使用一个特定的数据库表格来保存主键;
  • SEQUENCE:为Oracle、PostgreSQL等不支持主键自增长的数据库提供了一种叫做“序列(sequence)"的主键生成机制;
  • IDENTITY:主键自增长;
  • AUTO:把主键生成策略交给持久化引擎,持久化引擎会根据数据库在以上三种主键生成策略中选择其中一种

@GeneratedValue 注解默认使用的策略是GenerationType.AUTO。 在关系型数据库中使用GenerationType.IDENTITY策略比较普遍一点

public @interface GeneratedValue {
    GenerationType strategy() default AUTO;
    String generator() default "";
}

一般使用 MySQL 数据库的话,使用GenerationType.IDENTITY策略比较普遍一点(分布式系统的话需要另外考虑使用分布式 ID)。

2. 通过 @GenericGenerator声明一个主键策略,然后 @GeneratedValue使用这个策略

@Id
@GeneratedValue(generator = "IdentityIdGenerator")
@GenericGenerator(name = "IdentityIdGenerator", strategy = "identity")
private Long id;

等价于:

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

3. 设置字段类型

@Column 声明字段。

示例:

设置属性 userName 对应的数据库字段名为 user_name,长度为 32,非空

@Column(name = "user_name", nullable = false, length=32)
private String userName;

设置字段类型并且加默认值:

Column(columnDefinition = "tinyint(1) default 1")
private Boolean enabled;

4. 指定不持久化特定字段

@Transient :声明不需要与数据库映射的字段,在保存的时候不需要保存进数据库 。

如果我们想让secrect 这个字段不被持久化,可以使用 @Transient关键字声明。

Entity(name="USER")
public class User {

    ......
    @Transient
    private String secrect; // not persistent because of @Transient

}

除了 @Transient关键字声明, 还可以采用下面几种方法:

static String secrect; // not persistent because of static
final String secrect = “Satish”; // not persistent because of final
transient String secrect; // not persistent because of transient

一般使用注解的方式比较多。

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;

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......
}

数据库里面对应存储的是 MAIL/FEMAIL。

7. 增加审计功能

在 JPA 中,支持在字段或者方法上进行注解@CreatedDate、@CreatedBy、@LastModifiedDate、@LastModifiedBy 实现对数值设置的时间控制。

首先需要通过@EnableJpaAuditing开启 JPA 审计功能。其中,

  • @CreatedDate:表示该字段为创建时间,在这个实体被 insert 的时候,会设置值
  • @CreatedBy :表示该字段为创建人,在这个实体被 insert 的时候,会设置值
  • @LastModifiedDate:表示该字段为最终修改时间
  • ``@LastModifiedBy`:表示该字段为最终修改人

8. 删除/修改数据

@Modifying 注解提示 JPA 该操作是修改操作,注意还要配合@Transactional注解使用。

@Repository
public interface UserRepository extends JpaRepository<User, Integer> {

    @Modifying
    @Transactional(rollbackFor = Exception.class)
    void deleteByUserName(String userName);
}

9. 关联关系

  • @OneToOne 声明一对一关系
  • @OneToMany 声明一对多关系
  • @ManyToOne声明多对一关系
  • MangToMang声明多对多关系

你可能感兴趣的:(Spring,java,spring)