Да, используя несколько API, вы можете, вот как мне нравится это делать, столкнулись с этой проблемой, с которой я использовал hibernate core & amp; должен был найти классы, в которых аннотируется определенная аннотация.
Сделайте эти пользовательские аннотации, используя которые вы отметите, какие классы вы хотите получить.
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface EntityToBeScanned {
}
Затем отметьте ваш класс с ним, как
@EntityToBeScanned
public MyClass{
}
Сделайте этот класс утилиты, который имеет следующий метод
public class ClassScanner {
public static Set<Class<?>> allFoundClassesAnnotatedWithEntityToBeScanned(){
Reflections reflections = new Reflections(".*");
Set<Class<?>> annotated = reflections.getTypesAnnotatedWith(EntityToBeScanned.class);
return annotated;
}
}
Вызовите метод allFoundClassesAnnotatedWithEntityToBeScanned (), чтобы получить набор найденных классов.
Вам понадобятся libs, приведенные ниже
<!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>21.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.javassist/javassist -->
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.22.0-CR1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.reflections/reflections -->
<dependency>
<groupId>org.reflections</groupId>
<artifactId>reflections</artifactId>
<version>0.9.10</version>
</dependency>
Обычно необходимо только использовать перечисление, где существует ясный набор объектов, которые не изменятся, например, основные цвета или сдержанные имена. Иначе справочные таблицы с соответственно реализованными внешними ключами являются в значительной степени всегда наилучшим вариантом.
существует возможная вариация на опцию справочной таблицы, где у Вас потенциально есть большое количество справочных таблиц для простых отношений идентификатора/значения. Пара домена/справочной таблицы может существенно уменьшить это количество требуемых таблиц, хотя с некоторой дополнительной сложностью кодирования. В этом случае у Вас были бы доменная таблица
DomainID int identity Domain varchar(255)
и ключ/таблица значений
DomainID int ID int identity Value varchar(255)
Следовательно, строка добавляется к таблице Domain, соответствующей каждой справочной таблице, которую Вы иначе использовали бы, и весь (ключевой домен) / пары значения, добавленные к таблице значений. Кроме упрощения структуры базы данных этот подход также имеет преимущество, что 'справочные таблицы' могут быть созданы в коде приложения динамично, который в некоторых приложениях может быть чрезвычайно полезным.
Я склонен идти для параметра базы данных, поскольку это включает легкие запросы со значимыми данными (т.е. имена, а не идентификатор).
, Если я довольно уверен, что значения не изменятся затем, я перечислю их в приложении как wellas, оно делает разработку намного легче, когда Вы не должны помнить идентификатор объекта, и также делает код намного более читаемым.
Этот подход позволяет мне выбирать, включать ли справочную таблицу в запросы или нет. Например, я включал бы его в запрос отчета, где я хочу отобразить справочное значение, но не могу включать его при загрузке данных в моем приложении, если я могу вывести его из перечисления вместо этого.
, Очевидно, если значения подвержены изменениям или перечисление модификации не может быть возможным.
Только можно судить влияние культуры UI, я на 100% уверен в культуре своих пользователей, так не должны волноваться об этом слишком много :).
Поиски, Поиски, Поиски (вставляют танцующее обезьяну видео здесь)
Мой персональный "лучшая практика" должны иметь все в базе данных. Положения в компании являются определенно справочной таблицей.
то же идет для переводов, которые могут быть немного более хитрыми, но обычно определение представления, присоединяющееся к таблице с таблицей преобразования, является хорошим началом.
Кроме того, если Положение является только международным значением, и Ваше приложение является одноязыковым, можно добавить заголовки положения непосредственно к базе данных.
Я всегда иду для параметра базы данных, поскольку это имеет несколько преимуществ, один из основных, являющихся Вами, может изменить имена/описания объектов в списках поиска, не имея необходимость изменять любой код. Также согласитесь с наличием единственной таблицы в противоположность большому количеству небольших таблиц, тот способ, которым Вы кодируете одну единственную стандартную программу для получения значений от базы данных, которая сокращает затраты на обслуживание. Наличие единственной стандартной программы означает, что можно инвестировать больше усилия в то, чтобы заставлять его работать хорошо.
в дополнение к ответу Cruachan выше, можно сойти с рук одна таблица, если у Вас есть отношения отцов и детей, где строки без родителя описывают домен. Все записи, принадлежащие домену, ссорятся как их родитель.
ID int autonumber -- integer primary key for performance
DomainID int -- null for domains
Name varchar(100) -- Name of the item
Description varchar(255)
, Таким образом, например, список валют мог содержать:
ID DomainID Name Description
100 NULL ISO Currencies List of ISO Currency codes
101 100 BHD Bahrain Dinar
102 100 GBP British Pound
103 100 EUR Euro
104 100 USD US Dollar
Я склонен почти всегда помещать такого рода вещь в таблицу. Если требовалось много, я буду кэшировать его. Если я должен программно обратиться к некоторым из них, я затем создам перечисление, которому установили его значения на значение ключа объекта поиска.
, Например, суррогатный первичный ключ (обычно, таким образом, мой уровень доступа к данным может беспрепятственно добавить/обновить его), поле для значения объекта, плюс "кандидат" (кандидат, находящийся в кавычках, так как он не требуется, таким образом, это является или уникальным или пустым). Тем путем я могу использовать перечисление в кавычках, чтобы относиться к определенным/важным объектам в таблице, но все еще иметь гибкость разрешения конечным пользователям добавить новые объекты. Специфические особенности модели данных, используемой действительно, зависят от Вашего предпочтения (некоторые люди могут кричать на меня прямо сейчас для того, чтобы не просто использовать поле "кандидата" в качестве истинного первичного ключа).
Если можно сохранить их, синхронизировался, я не думаю, что существует большая часть причины не иметь обоих. Когда я разрабатывал некоторую функциональность конечного автомата с хранилищем DB, она сделала вещи намного легче иметь перечисление доступных объектных состояний в моем IDE.
я записал мне немного дополнения EnumGenerator Visual Studio некоторое время назад, которое создает фрагмент кода Перечисления в C# от столбцы ID и DESC планшета DB, из которого Вы выбираете прямо в IDE. Я не выпустил его, потому что это был первый раз, когда я работал с Дополнениями VS, и это было довольно дрянным, но я держал пари, что кто-то с опытом дополнения/генерации кода мог взять идею и выполнение с нею.
Единственная вещь, Вы - планирование помещения в дб этот список работодателей?
, Если да, отбросьте его в файле и будьте сделаны с ним.
DBS является большим, но если Вам нужно простое значение ключа, они - излишество. Они дают Вам много материала. Но они также делают много материала негласно, они - еще одна вещь, которую необходимо поддерживать..., если можно сойти с рук единственный файл с 20 разграниченными вкладкой строками, пойдите с простотой.
, Если у Вас есть много вещей, которые требуют этих видов поисков, или если Вы думаете, что, возможно, должны были бы обновить их, в то время как клиент пытается считать их, или если Вы могли бы хотеть перекрестно сослаться на вещи позже - затем, идут для DB.