Configurando um Esquema ObjectQuery

O ObjectQuery conta com o esquema ou informações de formato para executar a verificação semântica e avaliar expressões de caminho. Esta seção descreve como definir o esquema no XML ou programaticamente.

Definindo o Esquema

O esquema do ObjectMap é definido no XML do descritor de implementação do ObjectGrid ou programaticamente utilizando as técnicas de configuração normais do eXtreme Scale. Para obter um exemplo de como criar um esquema, consulte Configurando um Esquema ObjectQuery

As informações do esquema descrevem os POJOs (Plain Old Java Objects): cujos atributos que os compõem e quais os tipos de atributos que podem ter, sejam os atributos de campos de chave primária, relacionamentos de um único valor ou de múltiplos valores, ou relacionamentos bidirecionais. As informações do esquema conduzem o ObjectQuery a utilizar acesso de campo ou acesso de propriedade.

Atributos que Podem Ser Consultados

Quando o esquema é definido no ObjectGrid, os objetos no esquema são examinados automaticamente utilizando reflexão para determinar quais atributos estão disponíveis para consulta. Você pode consultar os tipos de atributos a seguir:
  • Os tipos primitivos Java incluindo wrappers
  • java.lang.String
  • java.math.BigInteger
  • java.math.BigDecimal
  • java.util.Date
  • java.sql.Date
  • java.sql.Time
  • java.sql.Timestamp
  • java.util.Calendar
  • byte[]
  • java.lang.Byte[]
  • char[]
  • java.lang.Character[]
  • Enum J2SE

Tipos serializáveis integrados que não aqueles indicados anteriormente também podem ser incluídos em um resultado da consulta, mas não podem ser incluídos na cláusula WHERE ou FROM da consulta. Atributos serializáveis não são navegáveis.

Os tipos de atributo podem ser excluídos do esquema se o tipo não for serializável, o campo ou propriedade é estática, ou o campo é temporário. Como todos os objetos de mapa devem ser serializáveis, o ObjectGrid inclui somente atributos que podem ser persistidos a partir do objeto. Outros objetos são ignorados.

Atributos de campo

Quando um esquema é configurado para acessar o objeto utilizando campos, todos serializáveis, os campos não-temporários são incorporados automaticamente no esquema. Para selecionar um atributo de campo em uma consulta, utilize o nome identificador de campo como ele existe na definição de classe.

Todos os campos público, privado, protegido e de pacote protegido são incluídos no esquema.

Atributos de propriedade

Quando o esquema está configurado para acessar o objeto usando propriedades, todos os métodos serializáveis que seguem as convenções de nomenclatura da propriedade JavaBeans serão automaticamente incorporadas no esquema. Para selecionar um atributo de propriedade para a consulta, use as convenções de nome de propriedade de estilo JavaBeans.

Todas as propriedades pública, privada, protegida e de pacote protegido são incluídas no esquema.

Na classe a seguir, os seguintes atributos são incluídos no esquema: name, birthday, valid.

public class Person {
  public String getName(){}
  private java.util.Date getBirthday(){}
  boolean isValid(){}
  public NonSerializableObject getData(){}
}

Ao utilizar um CopyMode de COPY_ON_WRITE, o esquema da consulta deve sempre utilizar o acesso baseado em propriedade. COPY_ON_WRITE cria objetos proxy sempre que os objetos são recuperados do mapa e podem acessar apenas aqueles objetos utilizando métodos de propriedade. A falha ao fazer isso resultará em cada resultado da consulta sendo configurado como nulo.

Relacionamentos

Cada relacionamento deve ser definido explicitamente na configuração do esquema. A cardinalidade do relacionamento é determinada automaticamente pelo tipo do atributo. Se o atributo implementa a interface java.util.Collection, então o relacionamento é um relacionamento de um-para-muitos ou de muitos-para-muitos.

Diferente das consultas de entidade, os atributos que se referem a outros objetos de cache não podem armazenar diretamente referências no objeto. As referências a outros objetos são serializadas como parte dos dados do objeto que as contém. Em vez disso, armazene a chave no objeto relacionado.

Por exemplo, se houver relacionamento de muitos-para-um entre um Cliente e o Pedido:

Incorrect. Storing an object reference.

public class Customer {
  String customerId;
  Collection<Order> orders;
}

public class Order {
  String orderId;
  Customer customer;
}
Correto. A chave para o objeto relacionado.

public class Customer {
  String customerId;
  Collection<String> orders;
}

public class Order {
  String orderId;
  String customer;
}

Quando uma consulta é executada de modo a unir os dois objetos de mapa, a chave será automaticamente aumentada. Por exemplo, a seguinte consulta retorna objetos de Cliente:

SELECT c FROM Order o JOIN Customer c WHERE orderId=5

Utilizando Índices

O ObjectGrid utiliza plugins de índice para incluir índices nos mapas. O mecanismo de consulta incorpora automaticamente todos os índices definidos em um elemento de mapa do esquema do tipo: com.ibm.websphere.objectgrid.plugins.index.HashIndex e a propriedade rangeIndex é configurada para true. Se o tipo do índice não for HashIndex e a propriedade rangeIndex não estiver configurada para true, então o índice é ignorado pela consulta. Consulte o Tutorial do ObjectQuery - Etapa 2 para obter um exemplo de como incluir um índice no esquema.