From d33075d2fa863e680a3798691f47477b2b1a6b4f Mon Sep 17 00:00:00 2001 From: Brad Kim Date: Wed, 27 May 2020 18:37:50 +0900 Subject: [PATCH] Modify checking for entity creation #925 --- .../kotlin/org/jetbrains/exposed/dao/Entity.kt | 9 +++++++-- .../org/jetbrains/exposed/dao/EntityClass.kt | 2 +- .../sql/tests/shared/entities/EntityTests.kt | 15 +++++++++++++++ 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/exposed-dao/src/main/kotlin/org/jetbrains/exposed/dao/Entity.kt b/exposed-dao/src/main/kotlin/org/jetbrains/exposed/dao/Entity.kt index fd53fd98c3..b397353331 100644 --- a/exposed-dao/src/main/kotlin/org/jetbrains/exposed/dao/Entity.kt +++ b/exposed-dao/src/main/kotlin/org/jetbrains/exposed/dao/Entity.kt @@ -26,6 +26,11 @@ open class Entity>(val id: EntityID) { _readValues!! } + internal fun isNewEntity(): Boolean { + val cache = TransactionManager.current().entityCache + return cache.inserts[klass.table]?.contains(this) ?: false + } + /** * Updates entity fields from database. * Override function to refresh some additional state if any. @@ -35,7 +40,7 @@ open class Entity>(val id: EntityID) { */ open fun refresh(flush: Boolean = false) { val cache = TransactionManager.current().entityCache - val isNewEntity = id._value == null + val isNewEntity = isNewEntity() when { isNewEntity && flush -> cache.flushInserts(klass.table) flush -> flush() @@ -139,7 +144,7 @@ open class Entity>(val id: EntityID) { } open fun flush(batch: EntityBatchUpdate? = null): Boolean { - if (id._value == null) { + if (isNewEntity()) { TransactionManager.current().entityCache.flushInserts(this.klass.table) return true } diff --git a/exposed-dao/src/main/kotlin/org/jetbrains/exposed/dao/EntityClass.kt b/exposed-dao/src/main/kotlin/org/jetbrains/exposed/dao/EntityClass.kt index ad6afa1129..2fe1e72fd7 100644 --- a/exposed-dao/src/main/kotlin/org/jetbrains/exposed/dao/EntityClass.kt +++ b/exposed-dao/src/main/kotlin/org/jetbrains/exposed/dao/EntityClass.kt @@ -47,7 +47,7 @@ abstract class EntityClass, out T: Entity>(val table: Id */ fun reload(entity: Entity, flush: Boolean = false): T? { if (flush) { - if (entity.id._value == null) + if (entity.isNewEntity()) TransactionManager.current().entityCache.flushInserts(table) else entity.flush() diff --git a/exposed-tests/src/test/kotlin/org/jetbrains/exposed/sql/tests/shared/entities/EntityTests.kt b/exposed-tests/src/test/kotlin/org/jetbrains/exposed/sql/tests/shared/entities/EntityTests.kt index 35c430f1f5..41c805b841 100644 --- a/exposed-tests/src/test/kotlin/org/jetbrains/exposed/sql/tests/shared/entities/EntityTests.kt +++ b/exposed-tests/src/test/kotlin/org/jetbrains/exposed/sql/tests/shared/entities/EntityTests.kt @@ -157,6 +157,21 @@ class EntityTests: DatabaseTestsBase() { } } + @Test fun testNewWithIdAndRefresh() { + val objectsToVerify = arrayListOf>() + withTables(Humans) { testDb -> + val x = Human.new(2) { + h = "foo" + } + x.refresh(flush = true) + objectsToVerify.add(x to testDb) + } + objectsToVerify.forEach { (human, testDb) -> + assertEquals("foo", human.h, "Failed on ${testDb.name}" ) + assertEquals(2, human.id.value, "Failed on ${testDb.name}" ) + } + } + internal object OneAutoFieldTable : IntIdTable("single") internal class SingleFieldEntity(id: EntityID) : IntEntity(id) { companion object : IntEntityClass(OneAutoFieldTable)