Java.Hibernate.Middle.How do you map enums in Hibernate?

Short Answer

In JPA/Hibernate, you map enums with the @Enumerated annotation, specifying whether to persist them as ordinal values (integers) or string names.

🔎 Detailed Explanation

🔹 Basic mapping example

@Entity
public class Order {
    @Id
    private Long id;

    @Enumerated(EnumType.STRING)
    private OrderStatus status;
}

public enum OrderStatus {
    NEW, PROCESSING, SHIPPED, DELIVERED
}

🔹 EnumType options
EnumType.ORDINAL (default):

  • Stores enum’s zero-based ordinal (e.g., 0, 1, 2…).
  • Compact in storage, but fragile → changing enum order breaks persisted data.

EnumType.STRING:

  • Stores enum’s name as text (e.g., “NEW”, “PROCESSING”).
  • More robust → safe when adding/reordering enum constants.

🔹 Example: ORDINAL

@Enumerated(EnumType.ORDINAL)
private OrderStatus status;

DB rows:

idstatus
10
21

⚠️ If you reorder enum constants → stored numbers map to the wrong statuses!

🔹 Example: STRING (recommended)

@Enumerated(EnumType.STRING)
private OrderStatus status;

DB rows:

idstatus
1NEW
2PROCESSING

✅ Much safer → adding new constants won’t break existing data.

🔹 Customize column name
You can control column names with @Column:

@Enumerated(EnumType.STRING)
@Column(name = "order_status")
private OrderStatus status;

📊 ORDINAL vs. STRING Comparison

FeatureORDINALSTRING
DB storageIntegerText
Storage sizeSmallerLarger
Safety on enum changes❌ Dangerous (reordering)✅ Safe (name-based)
Recommended forRarelyAlmost always

📌 Key Takeaways

✅ Use @Enumerated(EnumType.STRING) → safer and more maintainable.
✅ Avoid EnumType.ORDINAL → fragile when enums change over time.
✅ Enum mapping lets you persist domain concepts cleanly without magic constants.

This entry was posted in Без рубрики. Bookmark the permalink.

Leave a Reply

Your email address will not be published.