BT

Disseminando conhecimento e inovação em desenvolvimento de software corporativo.

Contribuir

Tópicos

Escolha a região

Início Notícias Melhorias da JPA 2.2

Melhorias da JPA 2.2

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

Conteúdo educacional

BT