spring-data-aop 常用注解解释

@Entity

@Entity 用于将一个 Java 类标记为一个实体类,即这个类代表数据库中的一个表。以下是 @Entity 注解的各个参数的详细解释:

1. name

  • 类型String
  • 描述:指定实体的名称。这是实体的全局唯一标识。如果不指定,JPA 提供商会使用实体类的名称。
  • 示例
    @Entity(name = "UserEntity")
    public class User {
        // ...
    }
    

@Table

@Table 注解在 JPA 中用于指定实体类与数据库表之间的映射关系。

1.name

  • 类型String
  • 描述:指定映射到实体类的数据库表的名称。如果不指定,JPA 默认使用实体类的名称作为表名。
  • 示例
    @Table(name = "user_table")
    public class User {
        // ...
    }
    

2.catalog

  • 类型String
  • 描述:指定表所在的数据库目录(catalog)的名称。这在一些数据库系统中可能不适用。
  • 示例
    @Table(name = "user", catalog = "my_catalog")
    public class User {
        // ...
    }
    

3.schema

  • 类型String
  • 描述:指定表所在的数据库模式(schema)的名称。这在一些数据库系统中可能不适用。
  • 示例
    @Table(name = "user", schema = "my_schema")
    public class User {
        // ...
    }
    

4.uniqueConstraints

  • 类型UniqueConstraint[]
  • 描述:定义表的列的唯一性约束。可以指定一个或多个列的组合作为唯一索引。
  • 示例
    @Table(uniqueConstraints = {
        @UniqueConstraint(name = "unique_name", columnNames = "name"),
        @UniqueConstraint(name = "unique_email", columnNames = "email")
    })
    public class User {
        // ...
    }
    

5.indexes

  • 类型Index[]
  • 描述:定义表的索引。可以指定一个或多个列的组合作为索引。
  • 示例
    @Table(indexes = {
        @Index(name = "index_name", columnList = "name"),
        @Index(name = "index_email", columnList = "email")
    })
    public class User {
            // ...
    }
    

:info: catalogschema 属性在 MySQL 数据库系统中可能不适用


@Column 字段映射

在 JPA (Java Persistence API) 中,@Column 注解用于映射实体类的字段到数据库表的列。这个注解提供了多个参数来定义列的属性,以下是 @Column 注解的各个参数的详细解释:

1. name

  • 类型String
  • 描述:指定数据库表中列的名称。如果不指定,JPA 会使用实体类字段的名称作为列名。
  • 示例
    @Column(name = "first_name")
    private String firstName;
    

2. columnDefinition

  • 类型String
  • 描述:自定义列的 SQL 类型,允许你指定列的 SQL 类型和大小等详细信息。
  • 示例
    @Column(columnDefinition = "VARCHAR(100) NOT NULL")
    private String username;
    

3. nullable

  • 类型boolean
  • 描述:指定列是否可以为 NULL。默认值为 true,表示列可以为 NULL
  • 示例
    @Column(nullable = false)
    private String username;
    

4. unique

  • 类型boolean
  • 描述:指定列是否具有唯一性约束。默认 false
  • 示例
    @Column(unique = true)
    private String email;
    

5. length

  • 类型int
  • 描述:指定列的最大长度。这个参数只对字符串类型的列有效。
  • 示例
    @Column(length = 50)
    private String firstName;
    

6. precision

  • 类型int
  • 描述:指定列的数值精度,表示列可以存储的数字的总位数。对数据库的 DECIMAL 类型的列有效。
  • 示例
    @Column(precision = 10, scale = 2)
    private BigDecimal amount;
    

7. scale

  • 类型int
  • 描述:指定列的数值精度,表示列的数值的小数精度。对数据库的 DECIMAL 类型的列有效。
  • 示例
    @Column(precision = 10, scale = 2)
    private BigDecimal amount;
    

8. insertable

  • 类型boolean
  • 描述:指定在插入操作时是否包含该列。默认 true
  • 示例
    @Column(insertable = false)
    private Date lastUpdated;
    

9. updatable

  • 类型boolean
  • 描述:指定在更新操作时是否包含该列。默认 true
  • 示例
    @Column(updatable = false)
    private Date lastUpdated;
    

10. table

  • 类型String
  • 描述:指定列所属的表名。在多表继承的情况下使用。
  • 示例
    @Column(table = "employee")
    private String employeeName;
    

11. columnDefinitionOverrides

  • 类型ColumnDefinitionOverride[]
  • 描述:允许为不同的数据库提供不同的列定义。
  • 示例
    @Column(columnDefinitionOverrides = {
        @ColumnDefinition(dbType = "varchar", length = 50, name = "username"),
        @ColumnDefinition(dbType = "varchar", length = 100, name = "email")
    })
    private String username;
    

@Id 主键映射

@Id 用于将一个 Java 类属性标记为主键


@GeneratedValue 主键生成策略

@GeneratedValue 是 JPA 中用于指定实体类中主键字段生成策略的注解。以下是 @GeneratedValue 注解的详细说明:

1. strategy

  • 类型GenerationType
  • 描述:指定主键的生成策略。GenerationType 是一个枚举,定义了以下几种策略:
    • IDENTITY:使用数据库的自增字段来生成主键,适用于支持自增的数据库,如 MySQL、PostgreSQL。
    • SEQUENCE:通过数据库序列来生成主键,适用于 Oracle。
    • TABLE:通过一个特定的数据库表来生成主键,这个表用于模拟序列。
    • AUTO:JPA 自动选择合适的策略 [默认选项]。
  • 示例
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    

2. generator

  • 类型String
  • 描述:指定生成器的名称,用于与 @GenericGenerator@SequenceGenerator@TableGenerator 注解结合使用,自定义主键生成策略。
  • 示例
    @Id
    @GeneratedValue(generator = "paymentableGenerator")
    @GenericGenerator(name = "paymentableGenerator", strategy = "uuid")
    private String id;
    

@GeneratedValue 注解通常与 @Id 注解一起使用,标识实体类中的字段为主键,并且定义了该主键的生成策略。这个注解可以放在字段上,也可以放在字段的 getter 方法上,但不能同时放在两者上,否则会抛出异常。


@GenericGenerator 主键生成策略

@GenericGenerator 是 JPA 中 Hibernate 提供的一个注解,用于定义自定义的主键生成策略。以下是 @GenericGenerator 注解的详细说明:

1. name

  • 类型String
  • 描述:指定生成器的名称,这个名称需要与 @GeneratedValue 注解中的 generator 属性相匹配。
  • 示例
    @GenericGenerator(name = "myGenerator", strategy = "myStrategy")
    

2. strategy

  • 类型String
  • 描述:指定生成策略的类名或策略名称。这个类需要实现 org.hibernate.id.IdentifierGenerator 接口。
  • 示例
    @GenericGenerator(name = "myGenerator", strategy = "com.example.MyIdentifierGenerator")
    

3. parameters

  • 类型Parameter[]
  • 描述:定义生成策略所需的参数。这些参数会传递给生成策略的构造函数或 configure 方法。
  • 示例
    @GenericGenerator(name = "myGenerator",
                      strategy = "myStrategy",
                      parameters = {
                          @Parameter(name = "paramName", value = "paramValue")
                      })
    

@GenericGenerator 注解允许开发者自定义主键生成逻辑,这在标准的 @GeneratedValue 策略无法满足需求时非常有用。例如,需要一个基于特定算法生成的 UUID,或者需要根据业务逻辑生成的主键。

在使用 @GenericGenerator 时,您需要定义一个生成策略类,并在 @GenericGenerator 中指定这个类的名称或策略名称。同时,可通过 parameters 属性传递必要的参数给生成策略。

以下是 @GenericGenerator 的一个使用示例,其中定义了一个自定义的 UUID 生成策略:

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import org.hibernate.annotations.GenericGenerator;
import org.hibernate.annotations.Parameter;

@Entity
public class MyEntity {
    //在这个例子中,@GeneratedValue 注解的 strategy 属性被设置为 TABLE,但实际上这个值是一个占位符,Hibernate 会忽略它,而是使用 @GenericGenerator 注解中定义的 strategy 属性来生成主键。@GenericGenerator 注解指定了生成策略为 uuid,这通常对应于 org.hibernate.id.UUIDGenerator 类
    @Id
    @GeneratedValue(strategy = GenerationType.TABLE, generator = "myCustomGenerator") // 注意这里strategy的值仅为占位符,Hibernate会忽略它
    @GenericGenerator(name = "myCustomGenerator",
                      strategy = "uuid")
    private Long id;

}

@Transient 不映射字段

@Transient 是 JPA(Java Persistence API)中的一个注解,用于标记实体类中的字段,表明该字段不是实体的一部分,即它不会被映射到数据库表的列中。这个注解通常用于两种情况:

  1. 临时状态

    • 当字段仅在应用程序的内存中使用,不需要持久化到数据库时,可以使用 @Transient 注解。例如,一些计算字段或者临时状态标记。
  2. 延迟加载

    • 当字段的加载不是立即需要的,可以将其标记为 @Transient,以延迟加载该字段,直到实际需要时才从数据库中检索。

以下是 @Transient 注解的详细说明:

  • name

    • 类型:String
    • 描述:为字段指定一个可选的名称。这在某些 JPA 实现中可能用于特定的目的,但在标准的 JPA 使用中通常不需要设置。
    • 默认值:无
  • value

    • 类型:boolean
    • 描述:设置为 true 表示字段是瞬态的,不持久化。

      在 JPA(Java Persistence API)中,当一个字段被标记为瞬态的(transient),意味着这个字段在实体的生命周期中不会被持久化到数据库中。它只在应用程序的内存中存在,不会被包含在数据库操作(如插入、更新、删除)中

    • 默认值:true(因为 valueboolean 类型,所以如果没有指定,默认为 false

示例:

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Transient;

@Entity
public class User {

    @Id
    private Long id;

    private String name;

    @Transient
    private String temporaryData; // 这个字段不会被持久化到数据库

    // 其他字段和getter/setter方法
}

在这个例子中,User 实体类有一个 temporaryData 字段,使用了 @Transient 注解,表示这个字段是瞬态的,不会映射到数据库表中。

使用 @Transient 注解的好处包括:

  • 减少数据库负载:不需要持久化的字段不会增加数据库的存储负担。
  • 提高性能:避免不必要的数据库操作,特别是在处理大量数据时。
  • 灵活性:可以在不改变数据库结构的情况下,灵活地在应用程序中使用临时数据。

总之,@Transient 注解是一个简单但非常有用的工具,用于控制实体类中哪些字段需要持久化,哪些字段仅在内存中使用。

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部