【问题标题】:spring data repository failed to save entity with idClassspring 数据存储库无法使用 idClass 保存实体
【发布时间】:2023-03-22 05:30:01
【问题描述】:

我有一个使用带有休眠实现的 spring data jpa 的简单项目。有一个具有复合 id 的实体,我将它与 xml 中的 id-class 映射。 我这样定义我的实体:

public class MyEntity {
    private long idA;
    private String idB;
    private String idC;

    public MyEntity() {
        super();
    }

    public MyEntity(long anIdA, String anIdB, String anIdC) {
        super();
        this.idA = anIdA;
        this.idB = anIdB;
        this.idC = anIdC;
    }

    public long getIdA() {
        return idA;
    }

    public String getIdB() {
        return idB;
    }

    public String getIdC() {
        return idC;
    }

    @Override
    public String toString() {
        return "Entity [idA=" + idA + ", idB=" + idB
                + ", idC=" + idC + "]";
    }
}

我这样定义 idClass:

public class MyEntityId implements Serializable {
    private static final long serialVersionUID = 9073138829628574603L;

    private long idA;
    private String idB;
    private String idC;

    public MyEntityId() {
    }

    public MyEntityId(long anIdA, String anIdB, String anIdC) {
        this.idA = anIdA;
        this.idB = anIdB;
        this.idC = anIdC;
    }

    public long getIdA() {
        return idA;
    }

    public String getIdB() {
        return idB;
    }

    public String getIdC() {
        return idC;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj != null && obj instanceof MyEntityId) {
            MyEntityId uk = (MyEntityId) obj;
            return this.idA == uk.getIdA()
                    && this.idB != null ?
                            this.idB.equals(uk.getIdB())
                            : uk.getIdB() == null
                    && this.idC != null ?
                            this.idC.equals(uk.getIdC())
                            : uk.getIdC() == null;
        }
        return false;
    }

    @Override
    public int hashCode() {
        return Objects.hash(idA, idB, idC);
    }

}

我的仓库是这样的:

public interface MyEntityJpaRepository extends
        JpaRepository<MyEntity, MyEntityId> {
}

还有 orm.xml

<entity class="myProject.domain.MyEntity" name="MyEntity"
    metadata-complete="true" access="FIELD">
    <table name="tb_myentity" />
    <id-class class="myproject.persistance.MyEntityId" />
    <attributes>
        <id name="idA">
            <column name="id_a" />
        </id>
        <id name="idB">
            <column name="id_b" />
        </id>
        <id name="idC">
            <column name="id_c" />
        </id>
    </attributes>
</entity>

现在的问题是: MyEntityJpaRepository.exists(aMyEntityIdInstance) 运行良好,但是 MyEntityJpaRepository.save(aMyEntityInstance) 抛出此异常:

org.springframework.dao.InvalidDataAccessApiUsageException:类不能为空;嵌套异常是 java.lang.IllegalArgumentException: Class 不能为 null

通过 SimpleJpaRepository.save

我发现 spring Data 似乎无法获取 ID。 我做错了什么或错过了什么? 任何机构都可以提供帮助?

编辑: 这是发生异常的代码。

    @Autowired
    private MyEntityJpaRepository myProxyRepository;
   ....
    public void append(long idA, String idB, String idC) {
        assertNotNull(idB);
        assertNotNull(idC);
        myProxyRepository.save(new MyEntity(idA, idB, idC)); //throw exception
    }

这是异常堆栈:

Caused by: java.lang.IllegalArgumentException: Class must not be null
at org.springframework.util.Assert.notNull(Assert.java:134)
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:97)
at org.springframework.beans.AbstractNestablePropertyAccessor.<init>(AbstractNestablePropertyAccessor.java:140)
at org.springframework.beans.BeanWrapperImpl.<init>(BeanWrapperImpl.java:109)
at org.springframework.data.util.DirectFieldAccessFallbackBeanWrapper.<init>(DirectFieldAccessFallbackBeanWrapper.java:39)
at org.springframework.data.jpa.repository.support.JpaMetamodelEntityInformation$IdentifierDerivingDirectFieldAccessFallbackBeanWrapper.<init>(JpaMetamodelEntityInformation.java:314)
at org.springframework.data.jpa.repository.support.JpaMetamodelEntityInformation.getId(JpaMetamodelEntityInformation.java:152)
at org.springframework.data.repository.core.support.AbstractEntityInformation.isNew(AbstractEntityInformation.java:51)
at org.springframework.data.jpa.repository.support.JpaMetamodelEntityInformation.isNew(JpaMetamodelEntityInformation.java:227)
at org.springframework.data.jpa.repository.support.SimpleJpaRepository.save(SimpleJpaRepository.java:507)
at sun.reflect.GeneratedMethodAccessor26.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.executeMethodOn(RepositoryFactorySupport.java:520)
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:505)
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:477)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:56)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:282)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136)

【问题讨论】:

  • 什么是 idB 和 idC 值?
  • 确保复合 ID 类使用的字段中没有空值。
  • @tdavid 所有值都不为空。问题不是零点。

标签: java spring spring-data-jpa composite-primary-key


【解决方案1】:

嗯,这是 spring-data-jpa 的缺陷,在 1.11.11.snapshot 中已修复。在发布版本之前,我必须在实体类上添加@IdClass注解。

【讨论】:

    猜你喜欢
    • 2021-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多