✅ 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:
id | status |
---|---|
1 | 0 |
2 | 1 |
⚠️ If you reorder enum constants → stored numbers map to the wrong statuses!
🔹 Example: STRING (recommended)
@Enumerated(EnumType.STRING)
private OrderStatus status;
DB rows:
id | status |
---|---|
1 | NEW |
2 | PROCESSING |
✅ 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
Feature | ORDINAL | STRING |
---|---|---|
DB storage | Integer | Text |
Storage size | Smaller | Larger |
Safety on enum changes | ❌ Dangerous (reordering) | ✅ Safe (name-based) |
Recommended for | Rarely | Almost 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.