JPA 和 Hibernate 常见注解及配置
1. @AccessType
指定访问实体属性的方式。可以是 FIELD
或 PROPERTY
。
FIELD
:直接访问字段。PROPERTY
:通过 getter/setter 方法访问属性。
示例:
@Entity
@Access(AccessType.FIELD)
public class User {
@Id
private Long id;
private String name;
}
2. @Any
用于定义可以映射到不同类型的关系。主要用于多态关系。
示例:
@Any(metaDef = "type")
@JoinColumn(name = "item_id")
private Item item;
3. @AnyMetaDef 和 @AnyMetaDefs
定义 @Any
注解使用的元数据。可以用 @AnyMetaDefs
注解定义多个 @AnyMetaDef
。
示例:
@AnyMetaDef(name = "type", metaType = "string", idType = "long", metaValues = {
@MetaValue(targetEntity = User.class, value = "USER"),
@MetaValue(targetEntity = Group.class, value = "GROUP")
})
4. @AttributeAccessor
指定属性访问器类型。通常用于与 @Access
注解一起使用。
5. @BatchSize
指定批量操作的大小,优化批处理操作的性能。
示例:
@Entity
@BatchSize(size = 20)
public class User {
@Id
private Long id;
}
6. @Cache 和 @CacheConcurrencyStrategy
用于配置缓存策略,指定实体或集合的缓存策略。
示例:
@Entity
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class User {
@Id
private Long id;
}
7. @CacheModeType
定义缓存模式类型,例如 NORMAL
、IGNORE
。
8. @Cascade 和 @CascadeType
指定级联操作的类型,例如 PERSIST
、MERGE
、REMOVE
。
示例:
@OneToMany(cascade = CascadeType.ALL)
private List<Order> orders;
9. @Check
用于添加数据库表级约束。
示例:
@Entity
@Table(name = "user", check = "age >= 18")
public class User {
@Id
private Long id;
}
10. @CollectionId 和 @CollectionType
用于集合类型的配置,@CollectionId
主要用于定义集合元素的 ID 生成策略。
11. @ColumnDefault
定义列的默认值。
示例:
@Column(name = "status", columnDefinition = "varchar(255) default 'ACTIVE'")
private String status;
12. @ColumnTransformer 和 @ColumnTransformers
定义列的转换器,用于在读取或写入数据库时转换列值。
13. @CreationTimestamp 和 @UpdateTimestamp
自动生成创建时间和更新时间。
示例:
@Entity
public class User {
@Id
private Long id;
@CreationTimestamp
private LocalDateTime createdDate;
@UpdateTimestamp
private LocalDateTime updatedDate;
}
14. @DiscriminatorFormula 和 @DiscriminatorOptions
用于配置单表继承策略中的判别列。
15. @DynamicInsert 和 @DynamicUpdate
@DynamicInsert
:仅插入变更的字段。
@DynamicUpdate
:仅更新变更的字段。
16. @Entity
标记一个类为 JPA 实体。
示例:
@Entity
public class User {
@Id
private Long id;
}
17. @Fetch 和 @FetchMode
定义实体或集合的抓取策略(如 JOIN
或 SELECT
)。
示例:
@OneToMany(fetch = FetchType.LAZY)
@Fetch(FetchMode.SUBSELECT)
private List<Order> orders;
18. @FetchProfile 和 @FetchProfiles
配置多种抓取策略,可以使用 @FetchProfiles
定义多个 @FetchProfile
。
19. @Filter 和 @FilterDef
定义和使用过滤器,用于在查询时动态过滤数据。
示例:
@Entity
@FilterDef(name = "statusFilter", parameters = @ParamDef(name = "status", type = "string"))
@Filter(name = "statusFilter", condition = "status = :status")
public class User {
@Id
private Long id;
}
20. @ForeignKey
定义外键约束的名称。
示例:
@ManyToOne
@JoinColumn(name = "role_id")
@ForeignKey(name = "fk_role")
private Role role;
21. @Formula
定义一个计算列,用于动态生成数据。
示例:
@Entity
public class User {
@Id
private Long id;
@Formula("(select count(*) from orders where user_id = id)")
private int orderCount;
}
22. @Generated 和 @GenerationTime
用于定义主键生成策略的时间。
示例:
@Id
@GeneratedValue(strategy = GenerationType.AUTO, generationTime = GenerationTime.INSERT)
private Long id;
23. @GenericGenerator 和 @GenericGenerators
定义自定义的主键生成器,可以通过 @GenericGenerators
定义多个生成器。
示例:
@Entity
public class User {
@Id
@GeneratedValue(generator = "custom-generator")
@GenericGenerator(name = "custom-generator", strategy = "uuid")
private String id;
}
24. @Immutable
标记实体为不可变的,实体的状态不能被修改。
示例:
@Entity
@Immutable
public class User {
@Id
private Long id;
}
25. @Index 和 @IndexColumn
定义索引以及指定索引列的顺序。
示例:
@Entity
@Table(indexes = @Index(name = "idx_name", columnList = "name"))
public class User {
@Id
private Long id;
}
26. @JoinColumnOrFormula 和 @JoinColumnsOrFormulas
配置关联列或公式,用于定义复杂的关联映射。
27. @LazyCollection 和 @LazyCollectionOption
控制集合的延迟加载策略。
示例:
@OneToMany(fetch = FetchType.LAZY)
@LazyCollection(LazyCollectionOption.TRUE)
private List<Order> orders;
28. @ListIndexBase
指定列表的索引基准,通常用于 @ElementCollection
。
29. @ManyToAny
用于多态的集合映射。
30. @MapKeyType
指定 @MapKey
的类型,用于映射到集合中的键。
31. @MetaValue
定义 @Any
注解使用的元数据。
32. @NamedNativeQueries 和 @NamedNativeQuery
定义命名的原生 SQL 查询,@NamedNativeQueries
允许定义多个 @NamedNativeQuery
。
示例:
@NamedNativeQuery(name = "findUserByName", query = "SELECT * FROM user WHERE name = :name", resultClass = User.class)
33. @NamedQueries 和 @NamedQuery
定义命名的 JPQL 查询,@NamedQueries
允许定义多个 @NamedQuery
。
示例:
@NamedQuery(name = "findUserByName", query = "SELECT u FROM User u WHERE u.name = :name")
34. @NaturalId
标记自然 ID,这是一种业务上唯一的标识符。
示例:
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@NaturalId
private String username;
}
35. @NotFound 和 @NotFoundAction
定义查找失败时的处理方式。
示例:
@ManyToOne
@NotFound(action = NotFoundAction.IGNORE)
private Role role;a
36. @OptimisticLock 和 @OptimisticLocking
定义乐观锁机制的配置。
示例:
@Entity
@OptimisticLock(type = OptimisticLockType.VERSION)
public class User {
@Id
private Long id;
@Version
private Long version;
}
37. @OrderBy
定义集合排序的规则。
示例:
@OneToMany
@OrderBy("date ASC")
private List<Order> orders;
38. @ParamDef 和 @Parameter
定义查询参数的元数据和参数映射。
示例:
@Query("SELECT u FROM User ua WHERE u.name = :name")
List<User> findByName(@Param("name") String name);
39. @Parent
指定实体的父类,用于继承关系。
40. @Persister
指定实体的自定义持久化处理器。
41. @Polymorphism 和 @PolymorphismType
定义多态关系的类型。
42. @Proxy
配置实体的代理机制。
43. @QueryHints
为查询设置特定的提示。
示例:
@QueryHints(@QueryHint(name = "org.hibernate.cacheable", value = "true"))
List<User> findAll();
44. @RowId
指定数据库中的行 ID。
45. @SelectBeforeUpdate
定义在更新之前是否进行选择操作。
46. @Sort 和 @SortComparator
定义集合的排序规则和比较器。
示例:
@OneToMany
@SortComparator(UserComparator.class)
private SortedSet<User> users;
47. @Source 和 @SourceType
定义数据源的类型和源。
48. @SQLDelete 和 @SQLDeleteAll
自定义删除 SQL 语句。
示例:
@Entity
@SQLDelete(sql = "UPDATE user SET deleted = true WHERE id = ?")
public class User {
@Id
private Long id;
}
49. @SqlFragmentAlias
指定 SQL 片段的别名。
50. @Subselect
定义一个子选择查询。
示例:
@Entity
@Subselect("SELECT id, name FROM user WHERE active = true")
public class ActiveUser {
@Id
private Long id;
}
51. @Synchronize
用于指定实体的同步策略。
52. @Table 和 @Tables
定义实体类对应的数据库表。
示例:
@Entity
@Table(name = "user")
public class User {
@Id
private Long id;
}
53. @Target
定义目标类型,用于在不同的上下文中应用注解。
54. @Tuplizer 和 @Tuplizers
定义实体的自定义 Tuplizer
,用于映射实体的方式。
55. @Type 和 @TypeDef
定义自定义数据类型映射。
示例:
@Entity
public class User {
@Id
private Long id;
@Type(type = "encryptedString")
private String sensitiveData;
}
56. @UpdateTimestamp
定义更新时间戳的字段,通常与 @CreationTimestamp
一起使用。
示例:
@Entity
public class User {
@Id
private Long id;
@UpdateTimestamp
private LocalDateTime updatedDate;
}
57. @ValueGenerationType
定义值生成的策略,例如 UUID。
58. @Where 和 @WhereJoinTable
定义在实体或关联表上的 SQL WHERE 子句,用于动态过滤数据。
示例:
@Entity
@Where(clause = "deleted = false")
public class User {
@Id
private Long id;
}
总结
掌握 JPA 和 Hibernate 中的这些注解和配置选项对于优化数据持久化层的性能和可维护性至关重要。它们不仅提供了丰富的功能来定义实体映射,还允许我们灵活地控制数据的读取、写入和缓存行为。通过合理使用这些技术,我们可以构建高效、可扩展的 Java 应用程序。