Description
Jimmer Version
0.9.50
JDK Version
JDK 21
Database
MySQL
OS
Mac
Expected behavior
应该能跑出正常的IllegalArgumentException
Actual behavior
抛出异常
There is no jimmer property for public long entity.ModelGroupDraft$$$DraftImpl.getPrevModelId()java.lang.RuntimeException: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: There is no jimmer property for public long entity.ModelGroupDraft$$$DraftImpl.getPrevModelId()
Description
这个问题源于把0.9.42升级到0.9.50
replay这个单元测试在0.9.42上是能过的,经测试在0.9.47+版本之后 client.saveInputs(groups,SaveMode.UPSERT, AssociatedSaveMode.APPEND_IF_ABSENT)会抛出异常,同时因为id unload的原因在抛出异常的过程中toString会抛出另外一个json序列化异常(这个问题应该很早就有,至少0.9.42版本就有,通过AssociatedSaveMode.UPDATE能复现)
很奇怪的是AssociatedSaveMode.MERGE就不会出现这个问题
堆栈信息
There is no jimmer property for public long entity.ModelGroupDraft$$$DraftImpl.getPrevModelId()java.lang.RuntimeException: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: There is no jimmer property for public long entity.ModelGroupDraft$$$DraftImpl.getPrevModelId()
at org.babyfish.jimmer.ImmutableObjects.toString(ImmutableObjects.java:365)
at entity.ModelGroupDraft$$$DraftImpl.toString(ModelGroupDraft.kt:815)
at java.base/java.lang.String.valueOf(String.java:4465)
at java.base/java.lang.StringBuilder.append(StringBuilder.java:173)
at org.babyfish.jimmer.meta.impl.KeyMatcherImpl$Item.isLoaded(KeyMatcherImpl.java:230)
at org.babyfish.jimmer.meta.impl.KeyMatcherImpl.match(KeyMatcherImpl.java:119)
at org.babyfish.jimmer.sql.ast.impl.mutation.AbstractPreHandler.add(PreHandler.java:198)
at org.babyfish.jimmer.sql.ast.impl.mutation.Saver.saveAllImpl(Saver.java:103)
at org.babyfish.jimmer.sql.ast.impl.mutation.Saver.lambda$saveAll$1(Saver.java:73)
at org.babyfish.jimmer.runtime.Internal.modifyDraft(Internal.java:173)
at org.babyfish.jimmer.runtime.Internal.lambda$produceList$2(Internal.java:74)
at org.babyfish.jimmer.runtime.Internal.usingDraftContext(Internal.java:102)
at org.babyfish.jimmer.runtime.Internal.produceList(Internal.java:64)
at org.babyfish.jimmer.sql.ast.impl.mutation.Saver.saveAll(Saver.java:69)
at org.babyfish.jimmer.sql.ast.impl.mutation.BatchEntitySaveCommandImpl.executeImpl(BatchEntitySaveCommandImpl.java:57)
at org.babyfish.jimmer.spring.cfg.support.SpringConnectionManager.execute(SpringConnectionManager.java:31)
at org.babyfish.jimmer.sql.ast.impl.mutation.BatchEntitySaveCommandImpl.execute(BatchEntitySaveCommandImpl.java:44)
at org.babyfish.jimmer.sql.ast.impl.mutation.BatchEntitySaveCommandImpl.execute(BatchEntitySaveCommandImpl.java:18)
at org.babyfish.jimmer.sql.kt.impl.KEntitiesImpl.saveEntities(KEntitiesImpl.kt:232)
at org.babyfish.jimmer.sql.kt.KSqlClient.saveEntities(KSqlClient.kt:237)
at org.babyfish.jimmer.sql.kt.KSaver.saveInputs(KSaver.kt:925)
at org.babyfish.jimmer.sql.kt.KSaver.saveInputs$default(KSaver.kt:918)
at service.ModelGroupService.upsert(ModelGroupService.kt:49)
at service.ModelGroupService.imports(ModelGroupService.kt:45)
at controller.FileController.imports(FileController.kt:36)
at service.DAOTests.testImports(DAOTests.kt:292)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: There is no jimmer property for public long entity.ModelGroupDraft$$$DraftImpl.getPrevModelId()
at com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:77)
at com.fasterxml.jackson.databind.SerializerProvider.reportBadDefinition(SerializerProvider.java:1328)
at com.fasterxml.jackson.databind.SerializerProvider._createAndCacheUntypedSerializer(SerializerProvider.java:1475)
at com.fasterxml.jackson.databind.SerializerProvider.findValueSerializer(SerializerProvider.java:578)
at com.fasterxml.jackson.databind.SerializerProvider.findTypedValueSerializer(SerializerProvider.java:856)
at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:330)
at com.fasterxml.jackson.databind.ObjectMapper._writeValueAndClose(ObjectMapper.java:4811)
at com.fasterxml.jackson.databind.ObjectMapper.writeValueAsString(ObjectMapper.java:4052)
at org.babyfish.jimmer.ImmutableObjects.toString(ImmutableObjects.java:363)
... 28 more
Reproduction steps
model
@MappedSuperclass
interface BaseEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
val id: Long
val createTime: LocalDateTime
val modifyTime: LocalDateTime
}
@Entity
@Table(name = "model")
interface Model : BaseEntity {
@Key
val modelNo: String
}
@Entity
@Table(name = "model_group")
interface ModelGroup : BaseEntity {
@Key(group = "default")
@Key(group = "uk")
val groupNo: String
@ManyToOne
@Key(group = "uk")
val prevModel: Model
@ManyToOne
@Key(group = "uk")
val nextModel: Model
val seconds: Int
}
dto
input CreateModelGroup {
groupNo
flat(prevModel) {
as(^ -> prev) {
modelNo
}
}
flat(nextModel) {
as(^ -> next) {
modelNo
}
}
seconds
}
input CreateModel {
modelNo
}
init.sql
create table if not exists model
(
id bigint primary key auto_increment,
model_no varchar(64) not null ,
create_time datetime default now() null,
modify_time datetime default now() null,
version int default 0 not null,
unique index model_uk (model_no)
) ;
create table if not exists model_group
(
id bigint primary key auto_increment,
group_no varchar(64) not null,
prev_model_id bigint not null ,
next_model_id bigint not null,
seconds bigint not null ,
create_time datetime default now() null,
modify_time datetime default now() null,
version int default 0 not null,
unique index group_uk (group_no, prev_model_id, next_model_id),
constraint foreign key (prev_model_id) references model (id),
constraint foreign key (next_model_id) references model (id)
)
unit test
@Test
fun replay() {
client.saveInputs(
listOf(CreateModel(modelNo = "test1"), CreateModel(modelNo = "test2")),
SaveMode.INSERT_IF_ABSENT
)
client.saveInputs(
listOf(
CreateModelGroup(
groupNo = "testGroup",
prevModelNo = "test1",
nextModelNo = "test2",
seconds = 100
),
CreateModelGroup(
groupNo = "testGroup",
prevModelNo = "test2",
nextModelNo = "test1",
seconds = 100
),
CreateModelGroup(
groupNo = "testGroup",
prevModelNo = "test1",
nextModelNo = "test1",
seconds = 100
)
), SaveMode.UPSERT, AssociatedSaveMode.APPEND_IF_ABSENT
)
}
Generated SQL
No response
Relation Model
No response
Screenshots
No response
Logs
No response