Как я могу сопоставить перечисление в БД с перечислением в моем классе, используя Hibernate? - PullRequest
1 голос
/ 31 мая 2019

У меня есть таблица "привет" в моей БД (Postgres 11) со столбцами: язык, перевод_строка, текст

и тип объекта enum "language" ('en', 'ru')

Цель - получить текст в нужной локали.

У меня есть некоторые заполненные данные на "привет"

+---------------+------------------------+-----------------------+
| language      | translation_string     | text                  |
|(enum language)|(varchar) (primary key) | (varchar)             |
|(primary key)  |                        |                       |
+---------------+------------------------+-----------------------+
| en            | new year greting       | Happy New Year!       |
| ru            | new year greting       | С Новым Годом!        |
+---------------+------------------------+-----------------------+

Я не могу правильно отобразить данные и получить «не удалось извлечь ResultSet; SQL [n / a]; вложенное исключение - org.hibernate.exception.SQLGrammarException: не удалось извлечь ResultSet». Также у меня есть составной футляр для ключей, и это усложняет ситуацию.

Я изменил тип столбца в тестовой БД на VARCHAR, и он отлично работает. Но я не могу сделать это в рабочей базе данных ...

Мой язык перечислений:

public enum Language {
    en, ru;

    public static Language getDefaultLocale(){
        return ru;
    }
}

My TranslationRepository.class

@Repository
public interface TranslationRepository extends JpaRepository<Greeting, GreetingIdentity> {

    Greeting getGreetingByIdentity(GreetingIdentity identity);

}

My Greeting.class

@Data
@Entity
@Table(schema = "common", name = "greetings")
public class Greeting {

    @EmbeddedId
    private GreetingIdentity id;

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

}

My GreetingIdentity.class

@Embeddable
public class GreetingIdentity implements Serializable {

    @NotNull
    @Enumerated(EnumType.ORDINAL)
    private Language lang;

    @NotNull
    private String translation_string;

    public GreetingIdentity(@NotNull String translation_string) {
        this.lang = Language.getDefaultLocale();
        this.translation_string = translation_string;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;
        if (obj == null || getClass() != obj.getClass()) return false;

        GreetingIdentity that = (GreetingIdentity) obj;
        if (!lang.equals(that.lang)) return false;

        return translation_string.equals(that.translation_string);
    }

    @Override
    public int hashCode() {
        int result = lang.hashCode();
        return 31 * result + translation_string.hashCode();
    }
}

вызов translationRepository.getGreetingByIdentity (Language.getDefaultLocale (), "новый год") с типом enum в БД завершается с ошибкой, упомянутой выше ... Что я делаю не так?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...