Essential Hibernate Annotations for Entity Mapping

Core Entity Mapping Annotations

@Entity

Marks a class as a persistent entity. Without parameters, the table name matches the class name. Use @Entity(name="custom_table") to override the default table name.

@Table

Specifies the database table name for an entity: @Table(name="user_data")

@Id and @GeneratedValue

Defines the primary key and its generation strategy:

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private Long identifier;

@Column

Configures column mapping with various attributes:

@Column(
    name = "user_name",
    nullable = false,
    length = 50,
    insertable = true,
    updatable = false
)
private String username;

Dynamic SQL and Immutability

@DynamicInsert and @DynamicUpdate

Enables dynamic SQL generation for insert and update operations:

@Entity
@DynamicInsert
@DynamicUpdate
public class UserEntity {
    // class implementation
}

@Immutable

Marks entities as read-only, preventing UPDATE sattements and enabling performance optimizations.

Validation and Constraints

@Basic

Defines basic attribute mapping with optional constraints:

@Basic(optional = false)
private String requiredField;

@NotNull

Provides runtime validation (doesn't affect DDL generation):

@NotNull(message = "Value cannot be null")
private String mandatoryField;

Access Strategies

@Access

Controls field vs property access strategy:

@Access(AccessType.FIELD)  // Field-based access
private String data;

@Access(AccessType.PROPERTY)  // Property-based access
public String getData() { return data; }

Advanced Mapping Features

@Formula

Defines computed properties using SQL expressions:

@Formula("CONCAT(first_name, ' ', last_name)")
private String fullName;

@ColumnTransformer

Transforms values during read/write operations:

@Column(name = "weight_grams")
@ColumnTransformer(
    read = "weight_grams / 1000",
    write = "? * 1000"
)
private Double weightKg;

@Generated

Handles database-generated values via triggers:

@Column(insertable = false, updatable = false)
@Generated(GenerationTime.INSERT)
private String autoGeneratedValue;

Temporal and Enumeration Handling

@Temporal

Specifies temporal type mapping:

@Temporal(TemporalType.TIMESTAMP)
private Date createdDate;

@CreationTimestamp and @UpdateTimestamp

Automatically manages creation and update timestamps:

@CreationTimestamp
@Column(updatable = false)
private Date createdOn;

@UpdateTimestamp
@Column(insertable = false)
private Date modifiedOn;

@Enumerated

Controls enum storage strategy:

@Enumerated(EnumType.STRING)
private UserStatus status;

Component and Inheritance Mapping

@Embeddable

Defines embeddable component classes:

@Embeddable
public class Address {
    @Column(nullable = false)
    private String street;
    
    @Column(nullable = false)
    private String postalCode;
}

@AttributeOverrides

Overrides embedded component column mappings:

@AttributeOverrides({
    @AttributeOverride(name = "street", column = @Column(name = "delivery_street")),
    @AttributeOverride(name = "postalCode", column = @Column(name = "delivery_zip"))
})
private Address deliveryAddress;

@MappedSuperclass

Defines non-persistent superclass properties inherited by entities.

@Inheritance

Configures inheritance strategies:

@Inheritance(strategy = InheritanceType.JOINED)
public abstract class BaseEntity {
    // common properties
}

Type Conversion and Large Objects

@Lob

Maps large object types (BLOB/CLOB).

@Type

Uses Hibernate type adapters:

@Type(type = "yes_no")
private Boolean verified;

@Convert

Applies custom value converters:

@Convert(converter = CurrencyConverter.class)
private MonetaryAmount price;

Tags: hibernate Java Persistence Entity Mapping annotations ORM

Posted on Fri, 11 Sep 2026 16:55:33 +0000 by merck_delmoro