From 2f600e3e69705087ac760e53d13c517ef0813297 Mon Sep 17 00:00:00 2001 From: Shicong Huang Date: Wed, 17 Jun 2020 12:39:34 -0400 Subject: [PATCH] Implement remaining methods in JpaTransactionManager (#633) --- .../JpaTransactionManagerImpl.java | 23 ++++++++++-------- .../transaction/TransactionManagerTest.java | 24 +++++++++++++++++++ 2 files changed, 37 insertions(+), 10 deletions(-) diff --git a/core/src/main/java/google/registry/persistence/transaction/JpaTransactionManagerImpl.java b/core/src/main/java/google/registry/persistence/transaction/JpaTransactionManagerImpl.java index b38cc7a89..22e6d55ca 100644 --- a/core/src/main/java/google/registry/persistence/transaction/JpaTransactionManagerImpl.java +++ b/core/src/main/java/google/registry/persistence/transaction/JpaTransactionManagerImpl.java @@ -122,32 +122,35 @@ public class JpaTransactionManagerImpl implements JpaTransactionManager { @Override public T transactNew(Supplier work) { - // TODO(shicong): Implements the functionality to start a new transaction. - throw new UnsupportedOperationException(); + return transact(work); } @Override public void transactNew(Runnable work) { - // TODO(shicong): Implements the functionality to start a new transaction. - throw new UnsupportedOperationException(); + transact(work); } @Override public T transactNewReadOnly(Supplier work) { - // TODO(shicong): Implements read only transaction. - throw new UnsupportedOperationException(); + return transact( + () -> { + getEntityManager().createNativeQuery("SET TRANSACTION READ ONLY").executeUpdate(); + return work.get(); + }); } @Override public void transactNewReadOnly(Runnable work) { - // TODO(shicong): Implements read only transaction. - throw new UnsupportedOperationException(); + transactNewReadOnly( + () -> { + work.run(); + return null; + }); } @Override public T doTransactionless(Supplier work) { - // TODO(shicong): Implements doTransactionless. - throw new UnsupportedOperationException(); + return transact(work); } @Override diff --git a/core/src/test/java/google/registry/persistence/transaction/TransactionManagerTest.java b/core/src/test/java/google/registry/persistence/transaction/TransactionManagerTest.java index 90c85bdca..da727f36e 100644 --- a/core/src/test/java/google/registry/persistence/transaction/TransactionManagerTest.java +++ b/core/src/test/java/google/registry/persistence/transaction/TransactionManagerTest.java @@ -116,6 +116,30 @@ public class TransactionManagerTest { assertEntityExists(theEntity); } + @TestTemplate + void transactNew_succeeds() { + assertEntityNotExist(theEntity); + tm().transactNew(() -> tm().saveNew(theEntity)); + assertEntityExists(theEntity); + } + + @TestTemplate + void transactNewReadOnly_succeeds() { + assertEntityNotExist(theEntity); + tm().transact(() -> tm().saveNew(theEntity)); + assertEntityExists(theEntity); + TestEntity persisted = tm().transactNewReadOnly(() -> tm().load(theEntity.key())); + assertThat(persisted).isEqualTo(theEntity); + } + + @TestTemplate + void transactNewReadOnly_throwsWhenWritingEntity() { + assertEntityNotExist(theEntity); + assertThrows( + RuntimeException.class, () -> tm().transactNewReadOnly(() -> tm().saveNew(theEntity))); + assertEntityNotExist(theEntity); + } + @TestTemplate void saveNew_succeeds() { assertEntityNotExist(theEntity);