Как обработать поле выбора с помощью JPA 2, Hibernate 3.5 - PullRequest
0 голосов
/ 01 мая 2010

У меня есть объект с целочисленными атрибутами, который выглядит следующим образом в прото-коде :

class MyEntity:
    String name

    @Choices({1, "BSD", 2, "Apache", 3, "GPL"}
    Integer frequency

    @ChoicesSegment({1000, 2000, 3000}, {"BSD", "Apache", "GPL"})
    Integer type

    String getFrequency()
           return getChoice("frequency", frequency)
    String getType()
           return getChoice("type", type)

возможно, это решение более выполнимо:

class MyEntity:
    String name

    final static private Something? frequencyChoices = {1000, 2000, 3000}, {"BSD", "Apache", "GPL"}
    Integer frequency

    final static private String[] typeChoices = new String[] {"BSD", "Apache", "GPL"}
    Integer type

    @Choices(MyEntity.frequencyChoices)
    String getFrequency()
           return frequency)

    @IntervalChoices(MyEntity.typeChoices)
    String getType()
           return type

* get ** методы доступа возвращают строки в соответствии с этой таблицей.

value(type) HumanReadableString(type)
  1             BSD
  2             Apache
  3             GPL

min frequency         max frequency    HumanReadableString(frequency)
    0                     1000                rare
    1000                  2000              frequent
    2001                  3000                sexy

Должна быть возможность получить все возможные значения, которые может принимать атрибут, например:

getChoices(MyEntity, "type") returns ("rare", "frequent", "sexy")

Должно быть возможно получить связанное значение из строки:

getValue(MyEntity, "frequency", "sexy") returns (2000,3000)

edit : цель всего этого Эти методы должны упростить генерацию форм и запросов (конечно, это не должно ограничиваться реализацией)

edit : добавлено, как я хотел бы сказать Java, что некоторые атрибуты являются специальными, чтобы он мог генерировать методы доступа get *.

edit : добавлено, как отправить в код варианты

edit : единственное, что я храню в БД, это целые числа, когда я хочу напечатать их, их нужно как-то преобразовать в их читаемую человеком строку.

Ответы [ 3 ]

1 голос
/ 04 мая 2010

Вы можете получить дополнительную информацию в перечислениях:

public enum License { 

    GPL("GPL"),

    APACHE("Apache License");

    public License(String displayName) {
        this.displayName=displayName;
    }

    String displayName;

 } 

Дополнительные функции по мере необходимости, но подробно рассмотрим, какие функции уже предоставлены классами Enum.

0 голосов
/ 16 января 2013

Я не пытался сохранить это, но вы можете попробовать следовать http://marekhalmo.blogspot.sk/2012/09/cool-java-enums.html

Я бы придерживался перечислений.

0 голосов
/ 19 мая 2010

Вы можете сделать это без каких-либо хлопот (но учтите, что значение в БД будет ordinal() значением перечислений. Итак:

public enum License { GPL, APACHE, BSD }

FrequencyChoices может перейти в @ElementCollection.

Если вам нужны читаемые человеком значения, вы можете преобразовать свой Enum в обычный класс и сохранить его в виде отдельной таблицы, чтобы вам было легче добавлять новые лицензии в список ...

@Entity
public class License {
    @Id long id;
    String name;
}
...