如何使用休眠将数据库中的枚举映射到类中的枚举?

时间:2019-05-31 10:16:50

标签: java postgresql hibernate enums

我在数据库(Postgres 11)中有一个带有列的表“ greetings”: 语言,translation_string,文本

和对象类型枚举“语言”(“ 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;
    }
}

我的TranslationRepository.class

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

    Greeting getGreetingByIdentity(GreetingIdentity identity);

}

我的Greeting.class

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

    @EmbeddedId
    private GreetingIdentity id;

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

}

我的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();
    }
}

在DB中用枚举类型调用translationRepository.getGreetingByIdentity(Language.getDefaultLocale(),“新年格里特”)失败,并出现上述错误... 我在做什么错了?

0 个答案:

没有答案
相关问题