JPA 和 Hibernate 常见注解及配置

JPA 和 Hibernate 常见注解及配置

1. @AccessType

指定访问实体属性的方式。可以是 FIELDPROPERTY

  • 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

定义缓存模式类型,例如 NORMALIGNORE

8. @Cascade 和 @CascadeType

指定级联操作的类型,例如 PERSISTMERGEREMOVE

示例:

@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

定义实体或集合的抓取策略(如 JOINSELECT)。

示例:

@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 应用程序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值