I recently faced a conundrum in that I wanted to use an enum to represent a value saved through Hibernate to a database. I didn’t want to store the name of the enum, rather a discriminator bound as a property of the enum. For example:
public enum Status { TOP_PRIORITY("Top Priority", 1), MIDDLE("Important", 2), LOW_PRIORITY("Low", 3), NONE("None", 4); private String display; private int value; Status(String display, int value) { this.display = display; this.value = value; } public String getDisplay() { return display; } public int getValue() { return value; } }
In this situation, I want the status stored as an INT. To do so, you may find online references of using the Hibernate annotation @Enumerated(EnumType.String) or @Enumerated(EnumType.Ordinal). You may also see an implementation of the UserType interface. I decided for a more… simple solution.
Instead of those, I create the following:
@Entity @Table("tasks") public class Task { // ID and other fields omitted @Column(name = "status", nullable = false) private int statusValue; @Transient private Status status; // getters & setters omitted // When setting the statusValue, set the Status public void setStatusValue(int statusValue) { this.statusValue = statusValue; this.status = Status.getFromIntValue(statusValue); } // when setting the status, set the statusValue public void setStatus(Status status) { this.status = status; if (status != null) { statusValue = status.getValue(); } } }
The final piece is to write a function in my Status enum to get a Status based on the int value.
In conclusion, rather than a larger process, just add a separate, transient attribute to hold the Status, and store it as the value.