Эффективная Java, пункт 32, состояния. Используйте EnumSet вместо битовых полей. Я также нашел этот хороший учебник по этой теме. Эта книга существует некоторое время, так почему бы мне не найти какие-либо сообщения о том, как сохранить EnumSet с Hibernate? Ну, я на самом деле нашел это, а другой, но они оба довольно старые, указывают на то же самое и гораздо более старое решение, которое, к сожалению, не помогло мне, возможно, из-за моего отсутствия более глубоких спящих знаний? Вот резюме моего кода:
public class MyThing {
public enum MyOptions {
FLAG1, FLAG2
}
@Id
private Long id;
@Column(name = "options")
private EnumSet<MyOptions> options;
// [other fields, getters, setters etc]
}
Я пробовал другие аннотации, такие как
@ElementCollection
с и без (targetclass= MyOptions.class)
а также
@JoinTable(name = "my_options",
joinColumns = @JoinColumn(name = "id"))
а также
@OneToMany
@JoinColumn(name = "options")
но не повезло.
Предпочтительно, я бы сохранил информацию в новом столбце таблицы my_thing
, но я мог бы также жить с отдельной таблицей для перечислений, если это необходимо.
Попробуй это
@ElementCollection
@CollectionTable(name = "my_options",
joinColumns = @JoinColumn( name = "mything_id"))
@Column(name = "option")
@Enumerated(EnumType.STRING)
private Set<MyOptions> options;
В этой конфигурации вам нужна таблица базы данных с именем my_options
с option
столбцов и mything_id
которая предназначена MyThing
таблицы MyThing
.
@Enumerated(EnumType.STRING) private EnumSet<MyOptions> regions;
Я получаюorg.hibernate.AnnotationException: Illegal attempt to map a non collection as a @OneToMany, @ManyToMany or @CollectionOfElements:
поэтому мне пришлось изменить свой метод get, чтобы безопасно получить экземпляр EnumSet <MyOptions>, выполнив это:public EnumSet<Region> getRegions() {
`return EnumSet.copyOf (region);` `}`