Hibernate | Сопоставление типа данных «байт» с преобразователем атрибутов перечисления не работает - ошибка: Нет сопоставления диалекта для JDB C тип: 277630005 - PullRequest
1 голос
/ 07 мая 2020

Используется версия с весенней загрузкой: 2.2.6.RELEASE | База данных: SqlServer 2008 | org.hibernate.dialect.SQLServer2008Dialect.


При использовании конвертера для отображения перечисление столбца типа «TINYINT», который будет относиться к «Byte» в java, представляет следующее ошибка:

Нет сопоставления диалекта для JDB C Тип: 277630005, когда ddl спящего режима для начального db.

Однако при выполнении прямого сопоставления как байта без использования перечисления он работает правильно.

Конвертер:

@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;
    }
}

Код объекта:

@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
}

Кто-нибудь знает, как решить?

1 Ответ

0 голосов
/ 07 мая 2020

Используйте columnDefinition

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