Java >> Java tutorial >  >> Tag >> SQL

Tips til dvaletilstand:Få SQL-forbindelsen brugt af din dvale-session

Hibernate Tips er en række indlæg, hvor jeg beskriver en hurtig og nem løsning på almindelige Hibernate-spørgsmål. Hvis du har et spørgsmål til et fremtidigt Hibernate Tip, bedes du efterlade en kommentar nedenfor.

Spørgsmål:

Vi bruger Hibernate i vores applikation, og vi skal nu implementere et rapporteringsbrug, som jeg vil bruge almindelig JDBC til. Hvordan får jeg forbindelsen som i øjeblikket bruges af Hibernate?

Løsning:

Hibernate giver ikke nogen metode til at hente java.sql.Connection der bruges af den aktuelle session . Men du kan kalde doWork(Work work) eller doReturningWork(ReturningWork arbejde) metode på sessionen interface til at udføre JDBC-relateret arbejde.

Hvis du bruger Hibernate via JPA API, skal du først pakke din EntityManager ud for at få en Hibernate-session. Jeg forklarede det mere detaljeret i Hibernate Tips:Sådan får du adgang til Hibernate API'er fra JPA.

OK, lad os se nærmere på doWork og doReturningWork metoder.

Handlinger uden en returværdi

Hvis du vil behandle nogle data uden at returnere nogen værdier til den, der ringer, skal du ringe til doWork metode med en implementering af Work interface. Du kan se et eksempel på det i følgende kodestykke.

EntityManager em = emf.createEntityManager();
em.getTransaction().begin();

Session session = em.unwrap(Session.class);
session.doWork(new Work() {
	
	@Override
	public void execute(Connection con) throws SQLException {
		// do something useful
		try (PreparedStatement stmt = con.prepareStatement("SELECT count(b.id) FROM Book b")) {
			ResultSet rs = stmt.executeQuery();
			while (rs.next()) {
				log.info("Found " + rs.getInt(1) + " books.");
			}
		}
	}
});

em.getTransaction().commit();
em.close();

Interfacet definerer kun execute(Connection connection) metode. Hibernate kalder det med en parameter af typen java.sql.Connection . Dette er forbindelsen, der bruges af den aktuelle dvaletilstand session , og du kan bruge det i execute metode til at udføre dine JDBC-handlinger.

Handlinger med en returværdi

For alle operationer, der returnerer en værdi, skal du bruge doReturningWork metode og kald den med en implementering af ReturningWork interface. Som du kan se i det følgende kodestykke, kan du gøre det på stort set samme måde, som du kalder doWork metode. Den eneste forskel er, at execute og doReturningWork metode returnerer en værdi i stedet for void.

EntityManager em = emf.createEntityManager();
em.getTransaction().begin();

Session session = em.unwrap(Session.class);
Integer bookCount = session.doReturningWork(new ReturningWork<Integer>() {

	@Override
	public Integer execute(Connection con) throws SQLException {
		// do something useful
		try (PreparedStatement stmt = con.prepareStatement("SELECT count(b.id) FROM Book b")) {
			ResultSet rs = stmt.executeQuery();
			rs.next();
			return rs.getInt(1);
		}
	}
	
});
log.info("Found " + bookCount + " books.");

em.getTransaction().commit();
em.close();

Få flere oplysninger:

Før du bruger doWork og doReturningWork metoder til at få adgang til java.sql.Connection , tjek venligst om du kan implementere din operation som en indbygget SQL-forespørgsel eller ved at bruge jOOQ. Begge giver en mere behagelig måde at udføre komplekse SQL-forespørgsler på.


Dvaletipsbog







Få flere opskrifter som denne i min nye bog Hibernate Tips:Mere end 70 løsninger på almindelige dvaleproblemer.

Den giver dig mere end 70 klar-til-brug opskrifter til emner som grundlæggende og avancerede kortlægninger, logning, Java 8-understøttelse, caching og statisk og dynamisk definerede forespørgsler.

Få det nu!



Java tag