Как вы определяете поле, например, email
как имеющее индекс, используя аннотации JPA. Нам нужен неуникальный ключ, email
потому что в этом поле буквально миллионы запросов в день, а без ключа это немного медленнее.
@Entity
@Table(name="person",
uniqueConstraints=@UniqueConstraint(columnNames={"code", "uid"}))
public class Person {
// Unique on code and uid
public String code;
public String uid;
public String username;
public String name;
public String email;
}
Я видел аннотацию, относящуюся к спящему режиму, но я стараюсь избегать решений от конкретных поставщиков, поскольку мы все еще выбираем между спящим режимом и ядром данных.
ОБНОВИТЬ:
Начиная с JPA 2.1, вы можете это сделать. См .: Аннотация @Index не разрешена для этого местоположения
Ответы:
С JPA 2.1 вы сможете это сделать.
Обновление : если вам когда-либо понадобится создать и проиндексировать два или более столбца, вы можете использовать запятые. Например:
источник
@Index
аннотации в@Table
аннотации? Я искал на JSR 338, но не нашел там. Ваш пост мне очень пригодился.Уникальная подобранная вручную коллекция аннотаций индекса
= Технические характеристики =
JPA 2.1+:
javax.persistence.Index
(или см. JSR-000338 PDF, стр. 452, пункт 11.1.23) АннотациюJPA
@Index
можно использовать только как часть другой аннотации, например@Table
,@SecondaryTable
и т. Д .:JDO 2.1+:
javax.jdo.annotations.Index
= Фреймворки ORM =
org.hibernate.annotations.Index
;org.apache.openjpa.persistence.jdbc.Index
иorg.apache.openjpa.persistence.jdbc.ElementIndex
(см. Справочное руководство );org.eclipse.persistence.annotations.Index
;org.datanucleus.api.jpa.annotations.Index
;com.amazon.carbonado.Index
;org.ujorm.orm.annot.Column
,index
иuniqueIndex
свойства;io.requery.Index
;Открыто ( библиотека Kotlin SQL): org.jetbrains.exposed.sql.Index , org.jetbrains.exposed.sql.Table # index () . Пример:
= ORM для Android =
com.activeandroid.annotation.Column
естьindex
,indexGroups
,unique
иuniqueGroups
свойства;ОБНОВЛЕНИЕ [2018]: ActiveAndroid был хорошей ORM 4 года назад, но, к сожалению, автор библиотеки прекратил ее поддерживать, поэтому кто-то раздвоил, исправил ошибки и переименовал ее в ReActiveAndroid - используйте это, если вы начинаете новый проект или см. Руководство по миграции, если вы хотите заменить ActiveAndroid в устаревшем проекте.
com.reactiveandroid.annotation.Column
имеетindex
,indexGroups
,unique
иuniqueGroups
свойства;com.j256.ormlite.field.DatabaseField
естьindex
свойство;org.greenrobot.greendao.annotation.Index
;org.orman.mapper.annotation.Index
;com.raizlabs.android.dbflow.sql.index.Index
( пример использования);= Другое (сложно категоризировать) =
io.realm.annotations.Index
;Просто выберите один из них.
источник
JPA 2.1 (наконец) добавляет поддержку индексов и внешних ключей! Подробности смотрите в этом блоге . JPA 2.1 является частью Java EE 7, которая отсутствует.
Если вам нравится жить на грани, вы можете получить последний снимок для eclipselink из их репозитория maven (groupId: org.eclipse.persistence, artifactId: eclipselink, версия: 2.5.0-SNAPSHOT). Только для аннотаций JPA (которые должны работать с любым поставщиком, если они поддерживают 2.1) используйте artifactID: javax.persistence, version: 2.1.0-SNAPSHOT.
Я использую его для проекта, который не будет завершен до его выпуска, и я не заметил никаких ужасных проблем (хотя я не делаю с ним ничего слишком сложного).
ОБНОВЛЕНИЕ (26 сентября 2013 г.): в настоящее время версии eclipselink доступны в центральном (основном) репозитории, поэтому вам больше не нужно добавлять репозиторий eclipselink в проекты Maven. Последняя версия выпуска - 2.5.0, но также присутствует 2.5.1-RC3. Я бы переключился на 2.5.1 как можно скорее из-за проблем с выпуском 2.5.0 (не работает modelgen).
источник
В JPA 2.1 вам нужно сделать следующее
В приведенном выше примере таблица TEST_PERSON будет иметь 3 индекса:
уникальный индекс по идентификатору первичного ключа
индекс по ВОЗРАСТУ
составной указатель FNAME, SNAME
Примечание 1. Вы получаете составной индекс, имея две аннотации @Index с одинаковым именем.
Примечание 2: вы указываете имя столбца в columnList, а не fieldName
источник
Я бы очень хотел иметь возможность указывать индексы базы данных стандартизованным способом, но, к сожалению, это не является частью спецификации JPA (возможно, потому, что поддержка генерации DDL не требуется спецификацией JPA, что является своего рода препятствием для такая особенность).
Поэтому для этого вам придется полагаться на расширение конкретного поставщика. Hibernate, OpenJPA и EclipseLink явно предлагают такое расширение. Я не могу подтвердить для DataNucleus, но поскольку определение индексов является частью JDO, я думаю, что это так.
Я действительно надеюсь, что поддержка индексов будет стандартизирована в следующих версиях спецификации и, таким образом, как-то не согласуется с другими ответами, я не вижу веских причин не включать такую вещь в JPA (тем более, что база данных не всегда находится под вашим контролем) для оптимальной поддержки генерации DDL.
Кстати, предлагаю скачать спецификацию JPA 2.0.
источник
Насколько мне известно, не существует способа указания индексов между JPA-провайдерами. Однако вы всегда можете создать их вручную прямо в базе данных, большинство баз данных будут получать их автоматически во время планирования запроса.
источник
javax.persistence.Index
EclipseLink предоставил аннотацию (например, @Index ) для определения индекса столбцов. Есть пример его использования. Часть примера включена ...
Поля firstName и lastName индексируются вместе и по отдельности.
источник
OpenJPA позволяет указывать нестандартную аннотацию для определения индекса свойства.
Подробности здесь .
источник
Подводя итог другим ответам:
org.hibernate.annotations.Index
org.apache.openjpa.persistence.jdbc.Index
org.eclipse.persistence.annotations.Index
Я бы просто выбрал одну из них. В любом случае он будет поставляться с JPA 2.1, и его не будет слишком сложно изменить, если вы действительно хотите сменить поставщика JPA.
источник
Это невозможно сделать с помощью аннотации JPA. И это имеет смысл: если UniqueConstraint четко определяет бизнес-правила, индекс - это просто способ ускорить поиск. Так что это действительно должен делать администратор базы данных.
источник
Это решение предназначено для EclipseLink 2.5, и оно работает (проверено):
Это предполагает возрастающий порядок.
источник