Java >> Java tutorial >  >> Tag >> new

Hvad er nyt i JPA 2.2

JPA 2.2 var kun en lille udgivelse, og det synes jeg er ok. JPA 2.1 giver allerede et godt nok værktøjssæt til de fleste applikationer. Men der var ikke desto mindre noget arbejde at gøre.

Stream forespørgselsresultater

Denne ændring spores i JPA-specifikationen nummer 99, og det lyder måske bekendt for dig. Hibernate introducerede en lignende funktion i version 5.2.

JPA-grænsefladen Forespørgsel og TypedQuery fik en ny metode kaldet getResultStream() som returnerer en Java 8 Stream af forespørgselsresultatet. Som standard uddelegerer denne metode til getResultList().stream() . Men en persistensudbyder, som Hibernate, kan tilsidesætte det for at give en bedre implementering.

Det er, hvad Hibernate allerede gør med stream() metoden for dens proprietære version af Forespørgslen interface. I stedet for at hente alle registreringer af forespørgselsresultatet på én gang, bruger den et ScrollableResult for at rulle gennem resultatposterne. Dette er langt mere effektivt, hvis du har brug for at behandle et stort resultatsæt.

Med JPA 2.2 kan du bruge følgende kode til at rulle gennem dine forespørgselsresultater.

Stream<Book> books = em.createQuery("SELECT b FROM Book b", Book.class).getResultStream();
books.map(b -> b.getTitle() + " was published on " + b.getPublishingDate())
	.forEach(m -> log.info(m));

Lav annoteringer @Repeatable

Dette er endnu en Java 8-relateret ændring, og den spores i JPA-specifikationen nummer 115.

Det giver dig mulighed for at bruge den samme annotering flere gange for en klasse eller attribut uden at bruge en containerannotering. Så du kan annotere din enhedsklasse med flere @NamedQuery annoteringer uden at pakke dem ind i en @NamedQueries anmærkning. Dette gør koden meget lettere at læse, som jeg viste, da Hibernate lavede deres annoteringer @Repeatable.

Med JPA 2.2 kan følgende annoteringer gentages:

  • Tilsidesættelse af forening
  • AttributOverride
  • Konverter
  • Deltag i kolonne
  • MapKeyJoinColumn
  • NamedEntityGraph
  • NamedNativeQuery
  • NamedQuery
  • NamedStoredProcedureQuery
  • PersistenceContext
  • PersistenceUnit
  • PrimaryKeyJoinColumn
  • Sekundærtabel
  • SqlResultSetMapping

Understøtter Java 8 Date and Time API

Date and Time API var en af ​​de mest populære funktioner i Java 8. Det er ingen overraskelse, at mange udviklere bad om officiel support i JPA, selv så du kan tilføje det med en simpel AttributeConverter .

Med JPA 2.2 har du ikke længere brug for konverteren. Som dokumenteret i JPA spec artefakt 63 tilføjer JPA 2.2 understøttelse af java.time.LocalDate , java.time.LocalTime , java.time.LocalDateTime , java.time.OffsetTime og java.time.OffsetDateTime .

Klasserne i Date and Time API'en giver alle nødvendige oplysninger for at tilknytte dem til de korrekte databasekolonner, og der er ikke behov for den gamle @Temporal anmærkning. Du kan blot bruge klasserne i Date and Time API som vist i følgende kodestykke.

@Entity
public class MyEntity {

	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	@Column(name = "id", updatable = false, nullable = false)
	private Long id;
	
	@Column
	private LocalDate date;
	
	@Column
	private LocalDateTime dateTime;
	
	...
}

Understøtte CDI-injektion i AttributConverters

Dette er sandsynligvis kun en mindre forbedring for de fleste udviklere. Med JPA 2.2 er du i stand til at bruge CDI-injektion i din AttributeConverter. Du kan gennemgå diskussionen om denne ændring i artefakt 109.

Understøttelsen af ​​CDI Injection giver dig mulighed for at injicere din genanvendelige konverteringsimplementering i en AttributeConverter .

@Converter(autoApply = true)
public class MyAttributeConverter implements AttributeConverter<MyObject, String> {

    @Inject
    private Converter convert;
	
    @Override
    public String convertToDatabaseColumn(MyObject obj) {
    	return convert.toString(obj);
    }

    @Override
    public MyObject convertToEntityAttribute(String s) {
    	return convert.toMyObject(s);
    }
}

Skift Persistence Provider Discovery Mechanism for Java 9-moduler

En masse rammer og specifikationer kræver et par tilpasninger for at fungere med JDK9-modulsystemet. Det er også tilfældet for JPA-specifikationen, og den blev diskuteret i artefakt #146.

Ekspertgruppen ændrede ordlyden af ​​specifikationen nogle få steder, så implementeringen af ​​persistensudbyderen nu skal levere en tjenesteudbyderkonfiguration, der kan bruges i et Java SE-miljø.

Oversigt

JPA 2.2 MR giver kun et lille sæt ændringer for at tilpasse JPA til Java 8 og forberede det til Java 9-modulsystemet. Som jeg skrev i begyndelsen af ​​dette indlæg, er det ikke et problem, fordi version 2.1 allerede gav et kraftfuldt værktøjssæt.

Men jeg havde håbet på et par ændringer mere. De forskellige JPA-implementeringer understøtter adskillige proprietære funktioner, som ville gøre specifikationen meget bedre, såsom understøttelse af ad-hoc joins i JPQL eller en bedre API til at indlæse flere entiteter efter deres primære nøgle.


Java tag