Visão geral
Neste guia, você pode aprender como usar a Extensão do MongoDB para Hibernate ORM para declarar índices de campo único, compostos e únicos em uma entidade. A extensão do Hibernate ORM traduz os índices e restrições únicas que você declara em suas entidades em operações de índice do MongoDB quando você habilita a geração de esquema.
Configurar a geração de esquema
Para criar os índice e restrições exclusivas declaradas em suas entidades, habilite a geração de esquema na configuração do seu aplicativo. Você pode habilitar a geração de esquema com a ação create ou create-drop:
create: Cria os objetos de esquema sem removê-los quando oSessionFactoryé fechado.create-drop: Cria os objetos de esquema quando oSessionFactoryabre e os descarta quando ele fecha.
Aviso
A ação create-drop destina-se ao desenvolvimento e teste. Não a utilize quando precisar preservar dados de produção.
Se você usa o Spring Boot, adicione a seguinte propriedade ao seu arquivo application.properties:
spring.jpa.properties.jakarta.persistence.schema-generation.database.action=create-dropSe você configurar o Jakarta Persistence diretamente, adicione a seguinte propriedade ao seu arquivo persistence.xml:
<property name="jakarta.persistence.schema-generation.database.action" value="create-drop"/>Alternativamente, você pode definir a propriedade em seu arquivo hibernate.properties:
jakarta.persistence.schema-generation.database.action=create-dropQuando a geração de esquema é executada, a extensão Hibernate ORM cria a coleção e emite comandos MongoDB createIndexes para os índice e restrições exclusivas que suas entidades declaram.
Tipos de índice
Os exemplo neste guia declaram índice e restrições exclusivas adicionando as anotações @Index e @UniqueConstraint à anotação @Table da seguinte entidade Movie:
@Entity@Table(name = "movies")public class Movie {
@Id @ObjectIdGenerator private ObjectId id; private String title; private String plot; private int year; private List<String> cast; private List<String> directors;
public Movie(String title, String plot, int year, List<String> cast, List<String> directors) { this.title = title; this.plot = plot; this.year = year; this.cast = cast; this.directors = directors; }
public Movie() { }
// Getter and setter methods}Índices de campo único
Os índices de campo único são índices com uma referência a um único campo dentro dos documentos de uma coleção. Eles melhoram o desempenho de query e classificação para um único campo.
O exemplo a seguir cria um índice de campo único em ordem decrescente no campo year:
@Table( name = "movies", indexes = { @Index(name = "idx_year", columnList = "year desc") })Defina columnList como o nome do campo e adicione asc ou desc para especificar a direção. Se você omitir a direção, o MongoDB criará um índice crescente. O elemento name especifica o nome do índice do MongoDB.
Para obter mais informações, consulte Índices de campo único no manual do MongoDB Server.
Índices compostos
Os índices compostos contêm referências a vários campos nos documentos de uma coleção, melhorando o desempenho de consulta e classificação.
O exemplo a seguir cria um índice composto nos campos title e year em ordem decrescente:
@Table( name = "movies", indexes = { @Index(name = "idx_title_year", columnList = "title desc,year desc") })A ordem dos campos no columnList determina a ordem em que o MongoDB classifica as chaves do índice, o que afeta quais prefixos de query o índice pode suportar. Por exemplo, um índice em title seguido por year pode dar suporte a query que correspondem apenas a title, enquanto um índice em year não ajuda uma query que corresponde apenas a title.
Para obter mais informações, consulte Índices compostos no manual do MongoDB Server.
Índice único e restrições
Índices únicos garantem que os campos indexados não armazenem valores duplicados.
Você pode criar um índice único com a anotação @Index ou @UniqueConstraint:
Use
@Index(unique = true)quando precisar especificar opções de índice, como a direção do campo.Use
@UniqueConstraintquando quiser usar o modelo de restrição em nível de tabela. Os campos emcolumnNamesdefinem a ordem da chave, e@UniqueConstraintnão especifica as direções do campo, portanto, o índice único resultante é crescente.
O exemplo a seguir cria um índice único no campo title:
@Table( name = "movies", indexes = { @Index(name = "idx_title", columnList = "title", unique = true) })O exemplo a seguir cria uma restrição exclusiva nos campos title e plot:
@Table( name = "movies", uniqueConstraints = { @UniqueConstraint(name = "uk_title_plot", columnNames = {"title", "plot"}) })O MongoDB trata um valor null ou ausente para um campo indexado como um valor indexado. Devido à restrição exclusiva, um índice único de campo único só pode conter um documento com um valor null em sua entrada de índice.
Importante
A criação de um índice único pode falhar
O MongoDB não pode criar um índice único no campo ou campos especificados se a coleção já contiver documentos com valores duplicados para esses campos. Revise seus dados existentes em busca de valores duplicados antes de criar um índice único.
Para obter mais informações, consulte índice único no manual do MongoDB Server.
Informações adicionais
Para aprender mais sobre como criar entidades e mapear dados incorporados, consulte o guia Criar entidades para representar coleções.
Para aprender como usar suas entidades para executar operações de banco de dados, consulte os guias Executar operações CRUD e Especificar uma query.
Para ver uma lista dos tipos de índice que a extensão Hibernate ORM suporta, consulte a página Compatibilidade de recursos.
Para aprender mais sobre as anotações do Jakarta Persistence usadas neste guia, consulte a documentação da Jakarta Persistence API.