Skip to content

Commit a3b2bde

Browse files
committed
Persist now also sets id to null in case of non-primitive id
Also tested now persist method.
1 parent 0f9653d commit a3b2bde

File tree

4 files changed

+70
-9
lines changed

4 files changed

+70
-9
lines changed

bee.persistent.test/datasource.a/src/main/kotlin/com/beeproduced/datasource/a/Entities.kt

+3
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,9 @@ data class GeneratedObjectId(
183183
val id: UUID = UUID.randomUUID()
184184
)
185185

186+
@BeeRepository
187+
interface GeneratedObjectIdRepository : BeeBlazeRepository<GeneratedObjectId, UUID>
188+
186189
@Entity
187190
data class GeneratedPrimitiveId(
188191
@GeneratedValue

bee.persistent.test/src/test/kotlin/com/beeproduced/bee/persistent/test/BeePersistentTestA.kt

+29
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,10 @@ class BeePersistentTestA(
4949
val circularRepository: CircularRepository,
5050
@Autowired
5151
val semiCircular1Repository: SemiCircular1Repository,
52+
@Autowired
53+
val generatedObjectIdRepository: GeneratedObjectIdRepository,
54+
@Autowired
55+
val generatedPrimitiveIdRepository: GeneratedPrimitiveIdRepository
5256
) {
5357
private val transaction = TransactionTemplate(transactionManager)
5458

@@ -727,6 +731,31 @@ class BeePersistentTestA(
727731
}
728732
}
729733

734+
735+
@Test
736+
fun `test persist`() {
737+
transaction.executeWithoutResult {
738+
val objectId = GeneratedObjectId()
739+
val pstObjectId = generatedObjectIdRepository.persist(objectId)
740+
assertNotNull(pstObjectId.id)
741+
742+
val primitiveId = GeneratedPrimitiveId()
743+
val pstPrimitiveId = generatedPrimitiveIdRepository.persist(primitiveId)
744+
assertNotNull(pstPrimitiveId.id)
745+
746+
val primitiveId2 = GeneratedPrimitiveId().copy(id = -42)
747+
val pstPrimitiveId2 = generatedPrimitiveIdRepository.persist(primitiveId2)
748+
assertNotNull(pstPrimitiveId2.id)
749+
750+
val default = GeneratedPrimitiveId::class.java
751+
.getConstructor()
752+
.newInstance()
753+
val primitiveId3 = GeneratedPrimitiveId().copy(id = -42)
754+
val pstPrimitiveId3 = generatedPrimitiveIdRepository.persist(primitiveId3.copy(id = default.id))
755+
assertNotNull(pstPrimitiveId3.id)
756+
}
757+
}
758+
730759
@BeforeAll
731760
fun beforeAll() {
732761
clear()

bee.persistent/src/blaze-processor/kotlin/com/beeproduced/bee/persistent/blaze/processor/codegen/BeePersistentBuilderCodegen.kt

+27-8
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import com.beeproduced.bee.persistent.blaze.processor.FullyQualifiedName
77
import com.beeproduced.bee.persistent.blaze.processor.codegen.BeePersistentBuilderCodegen.PoetConstants.BUILDER
88
import com.beeproduced.bee.persistent.blaze.processor.codegen.BeePersistentBuilderCodegen.PoetConstants.CLAZZ
99
import com.beeproduced.bee.persistent.blaze.processor.codegen.BeePersistentBuilderCodegen.PoetConstants.FIELD
10+
import com.beeproduced.bee.persistent.blaze.processor.info.AbstractProperty
1011
import com.beeproduced.bee.persistent.blaze.processor.info.EntityInfo
1112
import com.beeproduced.bee.persistent.blaze.processor.info.EntityProperty
1213
import com.beeproduced.bee.persistent.blaze.processor.info.RepoInfo
@@ -85,15 +86,19 @@ class BeePersistentBuilderCodegen(
8586

8687
private fun FileSpec.Builder.buildInfo(entity: EntityInfo) = apply {
8788
val access = entity.accessInfo(false)
88-
if (access.reflectionProps.isEmpty()) return@apply
89+
val hasPrimitiveId = entity.hasPrimitiveId()
90+
if (access.reflectionProps.isEmpty() && hasPrimitiveId) return@apply
8991

9092
val infoObj = TypeSpec.objectBuilder(entity.infoName())
9193
val entityClassName = entity.declaration.toClassName()
92-
for (property in access.reflectionProps) {
94+
95+
val properties = access.reflectionProps + entity.id
96+
97+
for (property in properties) {
9398
val reflectionField = PropertySpec
9499
.builder(property.infoField(), poetMap.classMapping(FIELD))
95100
.initializer(
96-
"%T::class.java.getDeclaredField(\"${property.simpleName}\").apply { isAccessible = true }",
101+
"%T::class.java.getDeclaredField(\"${property.simpleName}\").apply·{·isAccessible·=·true·}",
97102
entityClassName
98103
)
99104
infoObj.addProperty(reflectionField.build())
@@ -166,10 +171,24 @@ class BeePersistentBuilderCodegen(
166171

167172
companion object {
168173
fun EntityInfo.builderName(): String = "${uniqueName}Builder"
169-
}
170-
171-
private fun EntityInfo.infoName(): String = "${uniqueName}BuilderInfo"
172-
173-
private fun EntityProperty.infoField(): String = "${simpleName}Field"
174174

175+
fun EntityInfo.infoName(): String = "${uniqueName}BuilderInfo"
176+
177+
fun AbstractProperty.infoField(): String = "${simpleName}Field"
178+
179+
fun EntityInfo.hasPrimitiveId(): Boolean {
180+
val type = id.type
181+
if (type.isMarkedNullable) return false
182+
val typeName = type.declaration.simpleName.asString()
183+
return when (typeName) {
184+
"Double" -> true
185+
"Float" -> true
186+
"Long" -> true
187+
"Int", "Short", "Byte" -> true
188+
"Boolean" -> true
189+
"Char" -> true
190+
else -> false
191+
}
192+
}
193+
}
175194
}

bee.persistent/src/blaze-processor/kotlin/com/beeproduced/bee/persistent/blaze/processor/codegen/BeePersistentRepoCodegen.kt

+11-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ import com.beeproduced.bee.generative.util.toPoetClassName
66
import com.beeproduced.bee.persistent.blaze.processor.FullyQualifiedName
77
import com.beeproduced.bee.persistent.blaze.processor.codegen.BeePersistentAnalyser.Companion.viewName
88
import com.beeproduced.bee.persistent.blaze.processor.codegen.BeePersistentBuilderCodegen.Companion.builderName
9+
import com.beeproduced.bee.persistent.blaze.processor.codegen.BeePersistentBuilderCodegen.Companion.infoField
10+
import com.beeproduced.bee.persistent.blaze.processor.codegen.BeePersistentBuilderCodegen.Companion.infoName
911
import com.beeproduced.bee.persistent.blaze.processor.codegen.BeePersistentRepoCodegen.PoetConstants.AUTOWIRED
1012
import com.beeproduced.bee.persistent.blaze.processor.codegen.BeePersistentRepoCodegen.PoetConstants.BEE_SELECTION
1113
import com.beeproduced.bee.persistent.blaze.processor.codegen.BeePersistentRepoCodegen.PoetConstants.CLAZZ
@@ -32,6 +34,7 @@ import com.beeproduced.bee.persistent.blaze.processor.codegen.BeePersistentRepoC
3234
import com.beeproduced.bee.persistent.blaze.processor.codegen.BeePersistentRepoCodegen.PoetConstants.__SELECTION_INFO_NAME
3335
import com.beeproduced.bee.persistent.blaze.processor.info.*
3436
import com.beeproduced.bee.persistent.blaze.processor.utils.accessInfo
37+
import com.beeproduced.bee.persistent.blaze.processor.utils.reflectionSetterName
3538
import com.beeproduced.bee.persistent.blaze.processor.utils.viewLazyColumnsWithSubclasses
3639
import com.google.devtools.ksp.processing.CodeGenerator
3740
import com.google.devtools.ksp.processing.Dependencies
@@ -293,8 +296,15 @@ class BeePersistentRepoCodegen(
293296
idLiteral: String,
294297
padding: String = ""
295298
) = apply {
296-
val idAssignment = if (idLiteral.isEmpty()) "" else "${e.id.simpleName}=$idLiteral"
299+
val idAssignment = if (idLiteral.startsWith("default.")) "${e.id.simpleName}=$idLiteral" else ""
297300
addNamedStmt("${padding}val e = entity.$_BEE_CLONE_FN { $idAssignment }")
301+
// TODO: Integrate into builder breaking nullability rules?
302+
if (idLiteral == "null") {
303+
val infoObjName = e.infoName()
304+
val infoField = e.id.infoField()
305+
val infoObjClass = ClassName(config.builderPackageName, infoObjName)
306+
addStatement("${padding}%T.${infoField}.set(e, null)", infoObjClass)
307+
}
298308
addNamedStmt("${padding}em.persist(e)")
299309
addNamedStmt("${padding}em.flush()")
300310
addNamedStmt("${padding}em.clear()")

0 commit comments

Comments
 (0)