Spring Data JPA, part of the larger Spring Data family, makes it easier to implement JPA based repositories. Spring Data JPA supports PostgreSQL and a wide range of other database systems. It adds an abstraction layer between your application and your database that makes your application easier to port from one database system to another.
Set up Spring Data JPA for Spanner PostgreSQL-dialect databases
You can integrate Spanner PostgreSQL-dialect databases with Spring Data JPA using the standard PostgreSQL Hibernate dialect and PGAdapter.
To see an example, refer to the full working sample application on GitHub.
Dependencies
In your project, add Apache Maven dependencies for Spring Data JPA, the PostgreSQL JDBC driver, and PGAdapter.
<dependencies>
<!-- Spring Data JPA -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- Add the PostgreSQL JDBC driver -->
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
</dependency>
<!-- Add PGAdapter as a dependency, so we can start it in-process -->
<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>google-cloud-spanner-pgadapter</artifactId>
</dependency>
</dependencies>
Start PGAdapter in-process
Add the following method to your application to start PGAdapter
directly from your Java application. PGAdapter runs in the same JVM as
your application, and the application connects to PGAdapter on
localhost:port
.
/** Starts PGAdapter in-process and returns a reference to the server. */
static ProxyServer startPGAdapter() {
// Start PGAdapter using the default credentials of the runtime environment on port 9432.
OptionsMetadata options = OptionsMetadata.newBuilder().setPort(9432).build();
ProxyServer server = new ProxyServer(options);
server.startServer();
server.awaitRunning();
return server;
}
Configuration
Configure application.properties
to use the PostgreSQL Hibernate
Dialect and the PostgreSQL JDBC Driver. Configure the PostgreSQL
JDBC Driver to connect to a PostgreSQL-dialect database through PGAdapter.
# The example uses the standard PostgreSQL Hibernate dialect.
spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect
# Defining these properties here makes it a bit easier to build the connection string.
# Change these to match your Cloud Spanner PostgreSQL-dialect database.
spanner.project=my-project
spanner.instance=my-instance
spanner.database=my-database
# This setting ensures that PGAdapter automatically commits the current transaction if it encounters
# a DDL statement in a read/write transaction, and then executes the DDL statements as a single DDL
# batch.
spanner.ddl_transaction_mode=options=-c%20spanner.ddl_transaction_mode=AutocommitExplicitTransaction
# This is the connection string to PGAdapter running in-process.
spring.datasource.url=jdbc:postgresql://localhost:9432/projects%2F${spanner.project}%2Finstances%2F${spanner.instance}%2Fdatabases%2F${spanner.database}?${spanner.ddl_transaction_mode}
# You can display SQL statements and stats for debugging if needed.
spring.jpa.properties.hibernate.show_sql=true
spring.jpa.properties.hibernate.format_sql=true
# Enable JDBC batching.
spring.jpa.properties.hibernate.jdbc.batch_size=100
spring.jpa.properties.hibernate.order_inserts=true
Full Sample Application
A working sample application is available on GitHub.
What's next
- Learn more about Spring Data JPA.
- Learn more about Hibernate ORM.
- View the repository for PGAdapter on GitHub.
- File a GitHub issue to report a bug or ask a question about PGAdapter.
- Integrate Spanner with Spring Data JPA (GoogleSQL dialect).