diff --git a/core/src/main/java/google/registry/model/registry/RegistryLockDao.java b/core/src/main/java/google/registry/model/registry/RegistryLockDao.java index 08d38538d..2dfc1a047 100644 --- a/core/src/main/java/google/registry/model/registry/RegistryLockDao.java +++ b/core/src/main/java/google/registry/model/registry/RegistryLockDao.java @@ -45,8 +45,8 @@ public final class RegistryLockDao { }); } - public static void save(RegistryLock registryLock) { + public static RegistryLock save(RegistryLock registryLock) { checkNotNull(registryLock, "Null registry lock cannot be saved"); - jpaTm().transact(() -> jpaTm().getEntityManager().persist(registryLock)); + return jpaTm().transact(() -> jpaTm().getEntityManager().merge(registryLock)); } } diff --git a/core/src/main/java/google/registry/schema/domain/RegistryLock.java b/core/src/main/java/google/registry/schema/domain/RegistryLock.java index 18da9da5c..c80fc8682 100644 --- a/core/src/main/java/google/registry/schema/domain/RegistryLock.java +++ b/core/src/main/java/google/registry/schema/domain/RegistryLock.java @@ -177,10 +177,7 @@ public final class RegistryLock extends ImmutableObject implements Buildable { @Override public Builder asBuilder() { - RegistryLock clone = clone(this); - // Revision ID should be different for every object - clone.revisionId = null; - return new Builder(clone); + return new Builder(clone(this)); } /** Builder for {@link google.registry.schema.domain.RegistryLock}. */ diff --git a/core/src/test/java/google/registry/model/registry/RegistryLockDaoTest.java b/core/src/test/java/google/registry/model/registry/RegistryLockDaoTest.java index 42809f71f..b5ccd3e4e 100644 --- a/core/src/test/java/google/registry/model/registry/RegistryLockDaoTest.java +++ b/core/src/test/java/google/registry/model/registry/RegistryLockDaoTest.java @@ -22,6 +22,7 @@ import google.registry.model.transaction.JpaTransactionManagerRule; import google.registry.schema.domain.RegistryLock; import google.registry.schema.domain.RegistryLock.Action; import google.registry.testing.AppEngineRule; +import java.util.Optional; import java.util.UUID; import javax.persistence.PersistenceException; import org.junit.Rule; @@ -71,10 +72,10 @@ public final class RegistryLockDaoTest { jpaTm() .transact( () -> { - RegistryLock secondLock = + RegistryLock updatedLock = RegistryLockDao.getByVerificationCode(lock.getVerificationCode()); - secondLock.setCompletionTimestamp(jpaTmRule.getTxnClock().nowUtc()); - RegistryLockDao.save(secondLock); + updatedLock.setCompletionTimestamp(jpaTmRule.getTxnClock().nowUtc()); + RegistryLockDao.save(updatedLock); }); jpaTm() .transact( @@ -86,6 +87,23 @@ public final class RegistryLockDaoTest { }); } + @Test + public void testUpdateLock_usingSamePrimaryKey() { + RegistryLock lock = RegistryLockDao.save(createLock()); + jpaTmRule.getTxnClock().advanceOneMilli(); + RegistryLock updatedLock = + lock.asBuilder().setCompletionTimestamp(jpaTmRule.getTxnClock().nowUtc()).build(); + jpaTm().transact(() -> RegistryLockDao.save(updatedLock)); + jpaTm() + .transact( + () -> { + RegistryLock fromDatabase = + RegistryLockDao.getByVerificationCode(lock.getVerificationCode()); + assertThat(fromDatabase.getCompletionTimestamp()) + .isEqualTo(Optional.of(jpaTmRule.getTxnClock().nowUtc())); + }); + } + @Test public void testFailure_saveNull() { assertThrows(NullPointerException.class, () -> RegistryLockDao.save(null));