我做了一个实验……两个 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 许可协议
默认情况下,mongo 集合中的 id 是字符串。要维护集合中对象的长 id,您可以选择一个单独的字段,如下所示: