BT

Melhorias da JPA 2.2

| por Kesha Williams Seguir 4 Seguidores , traduzido por Diogo Carleto Seguir 40 Seguidores em 01 fev 2018. Tempo estimado de leitura: 3 minutos |

A Oracle lançou recentemente a versão 2.2 da Java Persistence API (JPA), que é o padrão para persistir objetos Java em um banco de dados relacional.

Como parte da plataforma Java EE 8, o JPA 2.2 inclui suporte para streaming de resultados de queries, injetar managed beans em conversores de atributos, repetir anotações, e trabalhar com APIs de Date e Time do Java 8. Embora as mudanças sejam poucas, são muito significantes uma vez que a JPA 2.2 é a primeira versão que usa o Java 8 como base.

Josh Juneau, em um artigo na Java Magazine de novembro/dezembro de 2017, comentou "O que é novo na JPA 2.2":

Finalmente o JPA fico alinhando com o Java SE 8, permitindo que os desenvolvedores façam uso de funcionalidades como a API de Date e Time, fazer streaming de resultados de queries, e anotações repetíveis.

Streaming de resultados de queries

O método getResultStream() foi adicionado tanto na interface Query como em TypedQuery. Essa melhoria retorna um stream dos resultados, fornecendo uma maneira conveniente de trabalhar com dados. Antes da JPA 2.2 somente listas eram retornadas de uma query. Os novos métodos de streaming podem ser usados como:

Stream stocks = entityManager  
  	.createNamedQuery(Stock.FIND_HIGH_PERFORMERS, Stock.class)  
  	.getResultStream();
stocks.filter(...)

Os streams ajudam queries a ter melhor performance, entretanto em alguns casos, a paginação do ResultSet pode ter melhor performance quando trabalhada com grandes conjuntos de dados. Alguns provedores de persistência levam isso em consideração e fornecem uma implementação melhor do getResultStream(). Os desenvolvedores devem levar em consideração a performance quando usarem streams para grandes conjuntos de dados.

Injeção de conversores de atributos

Na JPA 2.2 é possível injetar managed beans em conversores de atributos usando Contexts e a anotação @Inject do CDI. Para usar essa funcionalidade, basta injetar recursos CDI em um conversor de atributo, de acordo com a necessidade.

@Converter(autoApply = true)
public class TheAttributeConverter implements AttributeConverter {
	@Inject
	private MyUtils utils;
	@Override
	public TheObject convertToEntityAttribute(String s) {
    	return utils.toTheObject(s);
	}
	@Override
	public String convertToDatabaseColumn(TheObject obj) {
    	return utils.toString(obj);
	}
}

Anotações repetíveis

Todas as anotações para as quais existe uma anotação de contêiner são agora repetíveis, o que permite várias instâncias da mesma anotação em uma classe, método ou atributo. Com a JPA 2.2, as seguintes anotações são repetitíveis:

  • AssociationOverride
  • AttributeOverride
  • Convert
  • JoinColumn
  • MapKeyJoinColumn
  • NamedEntityGraph
  • NamedNativeQuery
  • NamedQuery
  • NamedStoredProcedureQuery
  • PersistenceContext
  • PersistenceUnit
  • PrimaryKeyJoinColumn
  • SecondaryTable
  • SqlResultSetMapping

Essa melhoria elimina a necessidade do uso de anotações de container, tornando o código mais fácil de ler, e permitindo construções como:

@Entity
@NamedQuery(name = "Stock.findBySymbol", query = "SELECT s FROM Stocks s WHERE s.symbol = :symbol")
@NamedQuery(name = "Stock.findByDate", query = "SELECT s FROM Stocks s WHERE s.date = :date")
@NamedQuery(name = "Stock.findByPrice", query = "SELECT s FROM Stocks s WHERE s.price = :price")
public class Stock {
	...
}

Suporte à API de Date e Time do Java 8

A JPA 2.2 fornece suporte básico para à API de Date e Time do Java 8 e inclui os seguintes mapeamentos para as classes no pacote java.time:

  • LocalDate
  • LocalTime
  • LocalDateTime
  • OffsetTime
  • OffsetDateTime

Ao contrário das versões anteriores da JPA, não é mais necessário escrever conversores de atributos para mapear os tipos de Date e Time do banco de dados para o Java 8 e vice versa. Como o suporte foi criado para a API Date e Time do Java, nenhum trabalho extra é necessário para usar os cinco tipos suportados e eles simplesmente se encaixam na API existente:

@Entity
public class Stock implements Serializable {
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	@Column(name = "ID", updatable = false, nullable = false)
	private Long id;
	@Column(name="LAST_BUY_DATE")
	private LocalDate lastBuyDate;
	@Column(name="LAST_BUY_TIME")
	private LocalDateTime lastBuyTime;
}

Uma vez que estas melhorias fazem parte da plataforma Java EE 8, apenas os servidores de aplicativos compatíveis os fornecem. No entanto, versões anteriores do Java EE podem acessá-las simplesmente incluindo os arquivos JAR aplicáveis no projeto.

Mais detalhes podem ser encontrados nas notas de lançamento da versão de manutenção Java Persistence 2.2.

Avalie esse artigo

Relevância
Estilo/Redação

Olá visitante

Você precisa cadastrar-se no InfoQ Brasil ou para enviar comentários. Há muitas vantagens em se cadastrar.

Obtenha o máximo da experiência do InfoQ Brasil.

Dê sua opinião

HTML é permitido: a,b,br,blockquote,i,li,pre,u,ul,p

Receber mensagens dessa discussão
Comentários da comunidade

HTML é permitido: a,b,br,blockquote,i,li,pre,u,ul,p

Receber mensagens dessa discussão

HTML é permitido: a,b,br,blockquote,i,li,pre,u,ul,p

Receber mensagens dessa discussão

Dê sua opinião

Faça seu login para melhorar sua experiência com o InfoQ e ter acesso a funcionalidades exclusivas


Esqueci minha senha

Follow

Siga seus tópicos e editores favoritos

Acompanhe e seja notificados sobre as mais importantes novidades do mundo do desenvolvimento de software.

Like

Mais interação, mais personalização

Crie seu próprio feed de novidades escolhendo os tópicos e pessoas que você gostaria de acompanhar.

Notifications

Fique por dentro das novidades!

Configure as notificações e acompanhe as novidades relacionada a tópicos, conteúdos e pessoas de seu interesse

BT