JPA Hibernate是否以任何可读格式持有任何枚举(地图键)? [英] JPA Hibernate Persist any Enum (a Map key) in human readable format?

查看:154
本文介绍了JPA Hibernate是否以任何可读格式持有任何枚举(地图键)?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

假设你有一个类,需要保存一些映射的项,使用任何枚举的密钥。使用该映射 varbinary (SQL Server)具有十六进制值。

  @Entity 
public abstract class X {
@ElementCollection
private Map&布尔>值;
}

这是有效的,但主要问题是可读性。数据库中的数据不可读。尝试使用 @MapKeyEnumerated(EnumType.STRING)或EnumType.Ordinal不起作用,因为枚举可以是任何类型,并保存 MyEnum .SOME_VALUE 为SOME_VALUE。



是否可以截取保存/检索并保存完全限定名称(com.x.myenum .value)或清晰的东西可以用来恢复枚举而不是十六进制值?

解决方案

存储地图key是一个枚举,并且可以在db中得到一些可读的数据,可以尝试:

  @Entity 
public class QuestionnaireDefinition {
...
@OneToMany(mappedBy =questionnaireDefinition,fetch = FetchType.LAZY,cascade = CascadeType.ALL)
@MapKeyEnumerated(EnumType.STRING)
@MapKeyColumn name =language,insertable = false,updatable = false)
private final Map< Language,QuestionnaireDefinitionTranslation> translations = new HashMap< Language,QuestionnaireDefinitionTranslation>();
...}

其中QuestionnaireDefinitionTranslation是将被赋予的实体或值,语言枚举
在此示例中,映射值为type:QuestionnaireDefinitionTranslation

  @Entity 
public class QuestionnaireDefinitionTranslation {

@Enumerated(EnumType.STRING)
@Column(nullable = false,insertable = true,updatable = true)
private语言;

@ManyToOne(fetch = FetchType.LAZY,optional = false)
private QuestionnaireDefinition questionnaireDefinition;

私有字符串文本;
...
}

类语言是一个普通的枚举: / p>

  public enum Language {
EN,ES,FI,FR;
}

这个工作的想法是:
1.首先持续所有者类:

 问卷定义问卷Def =新问卷定义(); 
em.persist(questionnaireDef);

然后使用您的枚举作为关键的聚合类。

  QuestionnaireDefinitionTranslation Translation = new QuestionnaireDefinitionTranslation(); 
translation.set(questionnaireDef);
translation.setLanguage(Language.En);
translation.setText(hello);
em.persist(翻译);

voilá这就是所有,你可以通过你的枚举获取

  QuestionnaireDefinition qd = em.find(1,QuestionnaireDefinition.class); 
qd.getTranslations()。get(Language.EN);

注意事务,LazyException和那些东西。


Say you have a class which needs to save some mapped items, using any Enum for the key. Using this mapping it generates e.g. varbinary (SQL Server) with a hexadecimal value.

@Entity
public abstract class X {
    @ElementCollection
    private Map<Enum, Boolean> values;
}

This works but the main issue is readability. The data in the database isn't human readable. trying to use @MapKeyEnumerated(EnumType.STRING) or with EnumType.Ordinal doesn't work since the Enum can be any type and that saves the MyEnum.SOME_VALUE as "SOME_VALUE".

Is it possible to intercept the save/retrieve and save a fully qualified name (com.x.myenum.value) or something legible which could be used to restore the enum instead of a hexadecimal value?

解决方案

To store a Map where key is an enum, and get something human readable in db you could try:

@Entity
public class QuestionnaireDefinition{
    ...
    @OneToMany(mappedBy = "questionnaireDefinition", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @MapKeyEnumerated(EnumType.STRING)
    @MapKeyColumn(name = "language", insertable = false, updatable = false)
    private final Map<Language, QuestionnaireDefinitionTranslation> translations = new HashMap<Language, QuestionnaireDefinitionTranslation>();
... }

where QuestionnaireDefinitionTranslation is the entity or value that will be fecthed given the Language enum. In this example the map value is type: QuestionnaireDefinitionTranslation

@Entity
public class QuestionnaireDefinitionTranslation {

    @Enumerated(EnumType.STRING)
    @Column(nullable = false, insertable = true, updatable = true)    
    private Language language;

    @ManyToOne(fetch = FetchType.LAZY, optional = false)
    private QuestionnaireDefinition questionnaireDefinition;

    private String text;
    ...
}

The class Language is an ordinary enum:

public enum Language {
    EN, ES, FI, FR;
}

The idea to make this work is: 1. First persist a the owner class:

QuestionnaireDefinition questionnaireDef = new QuestionnaireDefinition();
em.persist(questionnaireDef );

and then the aggregated class using your enum as key.

QuestionnaireDefinitionTranslation translation = new QuestionnaireDefinitionTranslation();
translation.set(questionnaireDef);
translation.setLanguage(Language.En);
translation.setText("hello");
em.persist(translation);

voilá that's all, you can fetch known by your enum

QuestionnaireDefinition qd = em.find(1,QuestionnaireDefinition.class);
qd.getTranslations().get(Language.EN);

Be aware with transactions, LazyException and that stuff.

这篇关于JPA Hibernate是否以任何可读格式持有任何枚举(地图键)?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆