Skip to content

@EnumeratedValue does not allow custom mapping of fields of Java enums #2460

Open
@AiswaryaR6

Description

@AiswaryaR6

The custom mapping of an enum to database column values is not functioning as expected.

Entity:

@Entity
public class Ticket {

    @Id
    private int id;
    private String name;

    @Enumerated(EnumType.ORDINAL)
    private TicketStatus status;

    @Enumerated(EnumType.STRING)
    private Priority priority;

    public static Ticket of(int id, String name, TicketStatus status, Priority priority) {
        Ticket ticket = new Ticket();
        ticket.setId(id);
        ticket.setName(name);
        ticket.setStatus(status);
        ticket.setPriority(priority);
        return ticket;
    }

  // getters and setters .....
}

Enum TicketStatus:

public enum TicketStatus {

    OPEN(1), CLOSED(2), CANCELLED(-1);

    @EnumeratedValue
    final int intValue;

    TicketStatus(int value) {
        this.intValue = value;
    }

    public int getIntValue() {
        return intValue;
    }

}

Enum Priority:

public enum Priority {

    HIGH("H"), MEDIUM("M"), LOW("L");

    @EnumeratedValue
    final String value;

    Priority(String value) {
        this.value = value;
    }
}

Persistence code

        Ticket ticket1 = Ticket.of(1, "ticket1", TicketStatus.OPEN, Priority.HIGH);
        Ticket ticket2 = Ticket.of(2, "ticket2", TicketStatus.CLOSED, Priority.LOW);
        Ticket ticket3 = Ticket.of(3, "ticket3", TicketStatus.CANCELLED, Priority.MEDIUM);
        tx.begin();
        em.persist(ticket1);
        em.persist(ticket2);
        em.persist(ticket3);
        tx.commit();

Persistence Logs:

[6/10/25, 17:14:09:447 IST] 00000057 id=00000000 eclipselink.sql                       3 [eclipselink.sql] INSERT INTO TICKET (ID, NAME, PRIORITY, STATUS) VALUES (?, ?, ?, ?)
	bind => [2, ticket2, LOW, 1]
[6/10/25, 17:14:09:448 IST] 00000057 id=00000000 eclipselink.query                      3 [eclipselink.query] Execute query InsertObjectQuery(id=1 name=ticket1 status=OPEN priority=HIGH)
[6/10/25, 17:14:09:448 IST] 00000057 id=00000000 eclipselink.sql                       3 [eclipselink.sql] INSERT INTO TICKET (ID, NAME, PRIORITY, STATUS) VALUES (?, ?, ?, ?)
	bind => [1, ticket1, HIGH, 0]
[6/10/25, 17:14:09:449 IST] 00000057 id=00000000 eclipselink.query                      3 [eclipselink.query] Execute query InsertObjectQuery(id=3 name=ticket3 status=CANCELLED priority=MEDIUM)
[6/10/25, 17:14:09:449 IST] 00000057 id=00000000 eclipselink.sql                       3 [eclipselink.sql] INSERT INTO TICKET (ID, NAME, PRIORITY, STATUS) VALUES (?, ?, ?, ?)
	bind => [3, ticket3, MEDIUM, 2]

Create Table Query

CREATE TABLE TICKET (ID INTEGER NOT NULL, NAME VARCHAR(255), PRIORITY VARCHAR(255), STATUS INTEGER, PRIMARY KEY (ID))

Expecting the enum Priority.LOW to be mapped to the database column value 'L' and TicketStatus.CLOSED to be mapped to the database column value 2, with similar behaviour observed for other enum fields as well.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions