当前位置:首页 > 行业动态 > 正文

hibernate属性级别注解实例代码

“`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 定义字段与数据库列的映射(必填项:namenullablelength等)
@Temporal 指定日期类型的存储格式(如DATETIMESTAMP
@Enumerated 定义枚举类型的存储方式(ORDINAL按序号存储,STRING按文本存储)
@Lob 标记大文本(CLOB)或二进制数据(BLOB
@Transient 标记非持久化字段(不映射到数据库)
@Basic 定义基础属性的fetch类型(如LAZY延迟加载)
@GeneratedValue 主键生成策略(配合@Id使用)

实例代码

以下是一个User实体类示例,演示属性级别注解的典型用法:

hibernate属性级别注解实例代码  第1张

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
}

说明:

  1. @Column:核心注解,用于定义字段名、长度、是否允许为空等。
    • nullable = false:对应数据库NOT NULL约束。
    • unique = true:添加唯一索引。
    • length = 50:限制字符串长度(防止超出数据库字段长度)。
  2. @Temporal:针对Date类型字段,指定存储精度:
    • TemporalType.DATE:仅存储日期(无时间)。
    • TemporalType.TIMESTAMP:存储日期和时间。
  3. @Enumerated:枚举类型存储方式:
    • EnumType.STRING:存储枚举值的字面量(如MALE)。
    • EnumType.ORDINAL:存储枚举的序号(如01)。
  4. @Lob:处理大文本或二进制数据,默认映射为CLOB(字符型)或BLOB(二进制型)。
  5. @Transient:标记字段不参与持久化(如临时计算字段)。
  6. @GeneratedValue:主键生成策略:
    • GenerationType.SEQUENCE:使用数据库序列生成主键。
    • GenerationType.IDENTITY:依赖数据库自增字段(如MySQL的AUTO_INCREMENT)。

注意事项

问题 解决方案
字段命名冲突 使用@Column(name="custom_name")显式指定列名,避免与数据库保留字冲突。
默认值处理 通过@Column(columnDefinition="DEFAULT '0'")设置数据库默认值。
主键生成策略兼容性 Oracle建议使用SEQUENCE,MySQL推荐IDENTITYAUTO
枚举类型存储争议 优先使用EnumType.STRING,避免因枚举顺序变化导致数据解析错误。

FAQs

Q1:@GeneratedValuestrategy如何选择?
A1:根据数据库类型选择:

  • MySQL/MariaDB:推荐GenerationType.IDENTITY(依赖AUTO_INCREMENT)。
  • Oracle/PostgreSQL:推荐GenerationType.SEQUENCE(需配合@SequenceGenerator)。
  • SQL Server:使用GenerationType.IDENTITYSEQUENCE(需手动创建序列)。

Q2:@Temporal(TemporalType.DATE)会影响时间部分吗?
A2:是的,若字段类型为java.util.Date且标注TemporalType.DATE,则仅存储日期部分,时间会被截断(如2023-01-01 12:00:00会存储为2023-01-01 00:00:00),如果需要完整时间,应使用`Temporal

0