弹簧数据 mongodb。生成id的错误

新手上路,请多包涵

我做了一个实验……两个 Spring 数据存储库的一个公共实体:- JPA - MongoDB

首先,我使用以下库版本:

spring-data-jpa:1.7.0.RELEASE spring-data-mongodb:1.6.0.RELEASE

我有一个实体:

 @Entity
@Table(name = "ACCOUNTS")
public class Account {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "ACCOUNT_ID")
    private Long id;

    @Column(name = "ACCOUNT_NUMBER")
    private String number;

    public Account() {
    }

    public Account(String number) {
        this.number = number;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getNumber() {
        return number;
    }

    public void setNumber(String number) {
        this.number = number;
    }
}

JPA 存储库具有以下外观:

 public interface Repository extends CrudRepository<Account, Long> {
    public Account findByNumber(String number);
}

MongoDB 存储库具有以下外观:

包 ua.home.springdata.investigation.repository.mongo;

 public interface Repository extends CrudRepository<Account, Long> {
}

所以… JPA 有效 :) 没什么特别的 :) 但是 MongoDB 测试没有通过 :( 我收到一个错误:

org.springframework.dao.InvalidDataAccessApiUsageException:无法为 ua.home.springdata.investigation.entity.Account 类型的实体自动生成 java.lang.Long 类型的 ID!
    在 org.springframework.data.mongodb.core.MongoTemplate.assertUpdateableIdIfNotSet(MongoTemplate.java:1149)
    在 org.springframework.data.mongodb.core.MongoTemplate.doSave(MongoTemplate.java:878)
    在 org.springframework.data.mongodb.core.MongoTemplate.save(MongoTemplate.java:833)
    在 org.springframework.data.mongodb.repository.support.SimpleMongoRepository.save(SimpleMongoRepository.java:73)
    在 org.springframework.data.mongodb.repository.support.SimpleMongoRepository.save(SimpleMongoRepository.java:88)
    在 org.springframework.data.mongodb.repository.support.SimpleMongoRepository.save(SimpleMongoRepository.java:45)
    在 sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)
    在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    在 org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.executeMethodOn(RepositoryFactorySupport.java:442)
    在 org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:427)
    在 org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:381)
    在 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
    在 org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)
    在 com.sun.proxy.$Proxy26.save(未知来源)

我认为这是一个非常普遍的案例。为什么 Spring 数据不能像 Long 那样生成实体 id?这太奇怪了。

原文由 b3lowster 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 356
2 个回答

默认情况下,mongo 集合中的 id 是字符串。要维护集合中对象的长 id,您可以选择一个单独的字段,如下所示:

   @Id
  @Field("_id")
  @JsonIgnore
  private String id;

  @Field("my_object_id")
  private Long myObjectId;

原文由 KayV 发布,翻译遵循 CC BY-SA 4.0 许可协议

Mongo ObjectIds 不映射到 java Long 类型。

我在 7.6.1 下的文档中看到了这一点:

http://docs.spring.io/spring-data/mongodb/docs/current/reference/html/#mongo-template.id-handling

如果可能,使用 Spring Converter 将在 Java 类中声明为 String 的 id 属性或字段转换为 ObjectId 并存储为 ObjectId。有效的转换规则委托给 MongoDB Java 驱动程序。如果无法转换为 ObjectId,则该值将作为字符串存储在数据库中。

在 Java 类中声明为 BigInteger 的 id 属性或字段将使用 Spring Converter 转换并存储为 ObjectId。

将 id 更改为 String 或 BigInteger 并删除策略参数。

原文由 Robert Moskal 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题