Hibernate | Mapping data type "byte" with enum attribute converter not working - error: No Dialect mapping for JDBC type: 277630005

Viewed 319

Using spring boot version: 2.2.6.RELEASE | Database: SqlServer 2008 | org.hibernate.dialect.SQLServer2008Dialect.


When using a converter for mapping the enumeration of a column of the type "TINYINT" that would be referring to "Byte" in java is presenting the following error:

No Dialect mapping for JDBC type: 277630005, when hibernate ddl for initial db.

However, when doing the direct mapping as Byte without using enumeration, it works correctly.

Converter:

@Converter
public class CharacterClassConverter implements AttributeConverter<CharacterClassIndicator, Byte> {
    @Override
    public Byte convertToDatabaseColumn(CharacterClassIndicator characterClassIndicator) {
        return characterClassIndicator != null ? characterClassIndicator.getCode() : null;
    }

    @Override
    public CharacterClassIndicator convertToEntityAttribute(Byte code) {
        return Stream.of(CharacterClassIndicator.values())
                .filter(value -> value.getCode().equals(code))
                .findFirst()
                .orElseThrow(UnsupportedOperationException::new);
    }
}

Enum:

public enum CharacterClassIndicator {
    DARK_WIZARD(0, "DK", "Dark Wizard"),
    SOUL_MASTER(1, "SM", "Soul Master"),
    GRAND_MASTER(2, "GM", "Grand Master"),
    DARK_KNIGHT(16, "DK", "Dark Knight"),
    BLADE_KNIGHT(17, "BK", "Blade Knight"),
    BLADE_MASTER(18, "BM", "Blade Master"),
    FAIRY_ELF(32, "FE", "Fairy Elf"),
    MOUSE_ELF(33, "ME", "Mouse Elf"),
    HIGH_ELF(34, "HE", "High Elf"),
    DARK_LORD(48, "DL", "Dark Lord"),
    LORD_EMPEROR(49, "LE", "Lord Emperor"),
    MAGIC_GLADIATOR(64, "MG", "Magic Gladiator"),
    DUEL_MASTER(65, "DM", "Duel Master");

    private final Byte code;
    private final String initials;
    private final String name;

    CharacterClassIndicator(Integer code, String initials, String name) {
        this.code = code.byteValue();
        this.initials = initials;
        this.name = name;
    }

    public Byte getCode() {
        return code;
    }

    public String getInitials() {
        return initials;
    }

    public String getName() {
        return name;
    }
}

The entity code:

@Entity
@Table(name = "Character")
public class Character {
    @Id
    @Column(name = "AccountID")
    private String id;

    @Column(name = "Name")
    private String name;

    @Column(name = "Class")
    @Convert(converter = CharacterClassConverter.class) // if remove this line and change type to Byte, works correctly
    private CharacterClassIndicator characterClass;

    @Column(name = "cLevel")
    private Integer level;

    @Column(name = "Strength")
    private Short strenght;

    @Column(name = "Dexterity")
    private Short dexterity;

    @Column(name = "Vitality")
    private Short vitality;

    @Column(name = "Energy")
    private Short energy;

    @Column(name = "Resets")
    private Integer resets;

    .... gets and setters
}

Would anyone have an idea how to solve?

1 Answers

Use columnDefinition

@Column(name = "Class", columnDefinition = "TINYINT") 
Related