Skip to content

[BUG] - KeyMatcherImpl中的IllegalArgumentException丢出时可能会有json序列化问题 #917

Closed
@zzxzz12345

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

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions