上一篇
hibernate属性级别注解实例代码
- 行业动态
- 2025-05-09
- 4
“`java,import javax.persistence.;,@Entity,public class User {, @Id @GeneratedValue private Long id;, @Column(length=50) private String name;, @Temporal(TemporalType.DATE) private Date birthDate
Hibernate属性级别注解详解与实例代码
在Hibernate(基于JPA规范)中,属性级别注解用于定义Java实体类属性与数据库表字段的映射关系,通过这些注解,可以精细控制字段的命名、类型、长度、是否可为空等特性,本文将详细介绍常用属性级别注解,并通过实例代码演示其用法。
常用属性级别注解
注解 | 作用 |
---|---|
@Column | 定义字段与数据库列的映射(必填项:name 、nullable 、length 等) |
@Temporal | 指定日期类型的存储格式(如DATE 、TIMESTAMP ) |
@Enumerated | 定义枚举类型的存储方式(ORDINAL 按序号存储,STRING 按文本存储) |
@Lob | 标记大文本(CLOB )或二进制数据(BLOB ) |
@Transient | 标记非持久化字段(不映射到数据库) |
@Basic | 定义基础属性的fetch类型(如LAZY 延迟加载) |
@GeneratedValue | 主键生成策略(配合@Id 使用) |
实例代码
以下是一个User
实体类示例,演示属性级别注解的典型用法:
import javax.persistence.; import java.util.Date; @Entity @Table(name = "t_user") // 表名映射 public class User { @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "user_seq") // 主键生成策略 @SequenceGenerator(name = "user_seq", sequenceName = "user_sequence", allocationSize = 1) // 自定义序列 private Long id; @Column(name = "username", length = 50, nullable = false, unique = true) // 字段名、长度、非空约束 private String username; @Column(name = "password", length = 100) // 默认nullable=true private String password; @Temporal(TemporalType.DATE) // 仅存储日期部分(YYYY-MM-DD) @Column(name = "birthday") private Date birthday; @Enumerated(EnumType.STRING) // 以字符串形式存储枚举值(如"MALE"/"FEMALE") @Column(name = "gender") private Gender gender; @Lob // 映射为CLOB类型 @Column(name = "resume") private String resume; @Transient // 不持久化到数据库 private String nonPersistentField; // Getters and Setters } // 枚举类示例 enum Gender { MALE, FEMALE }
说明:
@Column
:核心注解,用于定义字段名、长度、是否允许为空等。nullable = false
:对应数据库NOT NULL
约束。unique = true
:添加唯一索引。length = 50
:限制字符串长度(防止超出数据库字段长度)。
@Temporal
:针对Date
类型字段,指定存储精度:TemporalType.DATE
:仅存储日期(无时间)。TemporalType.TIMESTAMP
:存储日期和时间。
@Enumerated
:枚举类型存储方式:EnumType.STRING
:存储枚举值的字面量(如MALE
)。EnumType.ORDINAL
:存储枚举的序号(如0
、1
)。
@Lob
:处理大文本或二进制数据,默认映射为CLOB
(字符型)或BLOB
(二进制型)。@Transient
:标记字段不参与持久化(如临时计算字段)。@GeneratedValue
:主键生成策略:GenerationType.SEQUENCE
:使用数据库序列生成主键。GenerationType.IDENTITY
:依赖数据库自增字段(如MySQL的AUTO_INCREMENT
)。
注意事项
问题 | 解决方案 |
---|---|
字段命名冲突 | 使用@Column(name="custom_name") 显式指定列名,避免与数据库保留字冲突。 |
默认值处理 | 通过@Column(columnDefinition="DEFAULT '0'") 设置数据库默认值。 |
主键生成策略兼容性 | Oracle建议使用SEQUENCE ,MySQL推荐IDENTITY 或AUTO 。 |
枚举类型存储争议 | 优先使用EnumType.STRING ,避免因枚举顺序变化导致数据解析错误。 |
FAQs
Q1:@GeneratedValue
的strategy
如何选择?
A1:根据数据库类型选择:
- MySQL/MariaDB:推荐
GenerationType.IDENTITY
(依赖AUTO_INCREMENT
)。 - Oracle/PostgreSQL:推荐
GenerationType.SEQUENCE
(需配合@SequenceGenerator
)。 - SQL Server:使用
GenerationType.IDENTITY
或SEQUENCE
(需手动创建序列)。
Q2:@Temporal(TemporalType.DATE)
会影响时间部分吗?
A2:是的,若字段类型为java.util.Date
且标注TemporalType.DATE
,则仅存储日期部分,时间会被截断(如2023-01-01 12:00:00
会存储为2023-01-01 00:00:00
),如果需要完整时间,应使用`Temporal