JPA Hibernate是否以任何可读格式持有任何枚举(地图键)? [英] JPA Hibernate Persist any Enum (a Map key) in human readable format?
问题描述
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屋!