4

我正在尝试使用 spring-data-couchbase 版本 1.0.0.RELEASE 持久化对象:

package com.spring.data.couchbase.user;

import javax.persistence.Entity;

import org.springframework.data.annotation.Id;
import org.springframework.data.couchbase.core.mapping.Field;

@Entity
public class User {

@Id
private String id;

public String getId() {
    return id;
}

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

@Field("lastName")
private String lastName;

public String getLastName() {
    return lastName;
}

public void setLastname(String lastName) {
    this.lastName = lastName;
}

public String getFirstName() {
    return firstName;
}

public void setFirstName(String firstName) {
    this.firstName = firstName;
}

@Field("firstName")
private String firstName;

   }

当我尝试将对象保存到 couchbase 数据库时,我得到一个 MappingException。下面是全栈。AFAIK 整个似乎都很好。spring-data-couchbase 有什么额外的期望吗?

Exception in thread "main" org.springframework.data.mapping.model.MappingException: An ID property is needed, but not found on this entity.
at org.springframework.data.couchbase.core.convert.MappingCouchbaseConverter.write(MappingCouchbaseConverter.java:316)
at org.springframework.data.couchbase.core.convert.MappingCouchbaseConverter.write(MappingCouchbaseConverter.java:50)
at org.springframework.data.couchbase.core.CouchbaseTemplate.save(CouchbaseTemplate.java:298)
at org.springframework.data.couchbase.core.CouchbaseTemplate.save(CouchbaseTemplate.java:149)
at org.springframework.data.couchbase.repository.support.SimpleCouchbaseRepository.save(SimpleCouchbaseRepository.java:82)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.executeMethodOn(RepositoryFactorySupport.java:358)
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:343)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.data.couchbase.repository.support.ViewPostProcessor$ViewInterceptor.invoke(ViewPostProcessor.java:80)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:91)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
at $Proxy18.save(Unknown Source)
at com.spring.data.couchbase.user.MyService.doWork(MyService.java:27)
at com.spring.data.couchbase.user.Main.main(Main.java:17)
4

4 回答 4

1

正如作者所回答的,您需要一个不为空的 ID,因为 Couchbase 本身通过其唯一 ID 标识每个文档。您应该在您的 ID 之上添加验证,以确保它始终不为空且不为空。

于 2014-05-22T08:31:10.337 回答
1

我认为问题如下:

1:你的类上有@Entity注解,这是一个JPA注解。改用 org.springframework.data.couchbase.core.mapping.Document 注释

2:CouchBase 存储名为 _id 的 id,因此您应该将该类中的字段重命名为 _id(根据http://developer.couchbase.com/documentation/mobile/current/develop/guides/couchbase-lite/native-api /document/index.html#special-properties

于 2016-10-05T15:20:16.210 回答
0
import com.couchbase.client.java.repository.annotation.Field;
import org.springframework.data.annotation.Id;
import org.springframework.data.annotation.Version;
import org.springframework.data.couchbase.core.mapping.Document;
import org.springframework.data.couchbase.core.mapping.id.GeneratedValue;
import org.springframework.data.couchbase.core.mapping.id.GenerationStrategy;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;

@Document
@Data
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode
@Builder
public class User {

  @Id
  @GeneratedValue(strategy = GenerationStrategy.UNIQUE)
  private String id;

  @Field("lastName")
  private String lastName;

  @Field("firstName")
  private String firstName;



  @Version
  private long version;

}

如果您没有明确设置 id,这应该可以工作。另外,使用@Document 而不是@Entity

于 2020-08-19T09:26:53.067 回答
0

您可以使用以下

import com.couchbase.client.java.repository.annotation.Field;
import com.couchbase.client.java.repository.annotation.Id;

@Id
@GeneratedValue(strategy = GenerationStrategy.UNIQUE)
public String id;
于 2018-10-14T11:29:51.177 回答