2014-10-26 1 views
9

Я сделал эксперимент ... один общий объект для хранилищ двух пружинных Дейтов: - JPA - MongoDBВесна данных mongodb. Генерация ошибки идентификаторам

первую очередь я, используя следующие библиотеки версии:

весны-данных- JPA: 1.7.0.RELEASE весна-данных MongoDB: 1.6.0.RELEASE

у меня есть Entity:

@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 Repos itory имеет следующий вид:

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: Cannot autogenerate id of type java.lang.Long for entity of type ua.home.springdata.investigation.entity.Account! 
    at org.springframework.data.mongodb.core.MongoTemplate.assertUpdateableIdIfNotSet(MongoTemplate.java:1149) 
    at org.springframework.data.mongodb.core.MongoTemplate.doSave(MongoTemplate.java:878) 
    at org.springframework.data.mongodb.core.MongoTemplate.save(MongoTemplate.java:833) 
    at org.springframework.data.mongodb.repository.support.SimpleMongoRepository.save(SimpleMongoRepository.java:73) 
    at org.springframework.data.mongodb.repository.support.SimpleMongoRepository.save(SimpleMongoRepository.java:88) 
    at org.springframework.data.mongodb.repository.support.SimpleMongoRepository.save(SimpleMongoRepository.java:45) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.executeMethodOn(RepositoryFactorySupport.java:442) 
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:427) 
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:381) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207) 
    at com.sun.proxy.$Proxy26.save(Unknown Source) 

Я думаю, что это очень распространенный случай . Почему не пружинные данные, способные генерировать идентификатор объекта, как долго? это так странно.

+0

Когда я добавляю аннотацию ** @ ** GeneratedValue моего IDE бросает ошибку тогда и там. Я использовал ** jpa ** зависимость в моем файле «pom.xml», но даже это не работает, поскольку я получаю, что он ищет базу данных MySQL, и я использую NoSQL (mongoDB). Поэтому, если вы можете мне помочь, пожалуйста, сделайте это. Заранее спасибо. – Learner

+0

@Neil Stockton Когда я добавляю аннотацию ** @ GeneratedValue **, моя IDE бросает ошибку тогда и там. Я использовал ** jpa ** зависимость в моем файле «pom.xml», но даже это не работает, поскольку я получаю, что он ищет базу данных MySQL, и я использую NoSQL (mongoDB). Поэтому, если вы можете мне помочь, пожалуйста, сделайте это. Спасибо заранее .. – Learner

ответ

17

Mongo ObjectIds не сопоставляется с Java Long типа.

Я вижу это в документ тация под 7.6.1:

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

An id property or field declared as a String in the Java class will be converted to and stored as an ObjectId if possible using a Spring Converter. Valid conversion rules are delegated to the MongoDB Java driver. If it cannot be converted to an ObjectId, then the value will be stored as a string in the database.

An id property or field declared as BigInteger in the Java class will be converted to and stored as an ObjectId using a Spring Converter.

Меняет идентификатор в строку или BigInteger и удалите аргумент стратегии.

+0

Тогда я потеряю совместимость с реализацией Spring JPA :( – b3lowster

+0

@Robert Moskal Когда я добавляю аннотацию ** @ GeneratedValue ** моя IDE бросает ошибку тогда и там. Я использовал ** jpa * * зависимостей в моем файле «pom.xml», но даже это не работает как то, что я получил, так это то, что он ищет базу данных MySQL, и я использую NoSQL (mongoDB). Поэтому, если вы можете мне помочь с чем-то, пожалуйста. заранее. – Learner

+0

Добавить новый вопрос и отметить меня –

1

Использование @Id как Строка прекрасно работает.

Убедитесь, что ваш репозиторий проходит с String (того же типа, что и @Id):

extends MongoRepository<MyEntity, String> 
1

Я тоже пытался что-то вроде этого, для Монго дб я должен был использовать версию import org.springframework.data.annotation.Id; из @Id в то время как JPA Я использовал import javax.persistence.Id;

1

Я думаю, проблема в том, что вы используете «Сущность» вместо «Документ». Mongo dao должен использовать аннотацию «Document», и репозиторий должен расширить интерфейс «MongoRepository». Это будет пример использования того, что у вас есть. Во-первых вы хотите добавить зависимость Монго к вашему ПОМ (я предполагаю, что вы используете пружинный загрузочный родитель, поэтому номер версии будет определен там)

<dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-data-mongodb</artifactId> 
</dependency> 

import org.springframework.data.annotation.Id; 
import org.springframework.data.mongodb.core.mapping.Document; 

@Document(collection = "ACCOUNTS") 
public class Account { 

     @Id 
     private String id; 

     ....rest of properties 
} 

import org.springframework.data.mongodb.repository.MongoRepository; 
public interface AccountRepository extends MongoRepository<Account, String> { 
     //any extra queries needed 
} 
0

Мой проект с использованием Spring Data Rest + Монго

  1. Тип данных Я не использую ни тип Long, ни BigInteger. Это настраиваемый объект. Скажем, CompanyUID.class. Здесь это должно быть MongoRepository<DataLoadMerchant, CompanyUID> как то, что @Miguel говорит Тогда я изменил свой геттер и сеттер.Преобразование строки в CompanyUID или CompanyUID в строку

  2. регистр преобразователя в Монго

    @Configuration 
    public class MongoConfig extends AbstractMongoConfiguration { 
    @Override 
    public CustomConversions customConversions() { 
        converters.add(new CompanyUIDoObjectIdConverter()); 
        converters.add(new ObjectIdToCompanyUIDConverter()); 
        return new CustomConversions(converters); 
        } 
    } 
    
  3. имя столбца. Я смотрю на документ монго. кажется, что я не могу иметь entityId с @Id, а также использовать entityId в качестве имени столбца. Поэтому я меняю сеттер Тогда в MongoDB будет 2 столбца . Один из них - _id, а другой - entityId. Два столбца имеют одинаковое значение. И мы используем только EntityId в качестве первичного ключа для CRUD, даже если он не является истинным первичным ключом

моего код

public class ClassA implements Serializable { 
    @Id 
    public CompanyUID id; 
    public CompanyUID entityId;' 

    public String getId() { 
     return this.id.toString(); 
    } 

    public void setId(String id) { 
     if (id != null && this.entityId != null) { 
      if (!id.equals(this.entityId)) { 
       throw new Exception(); 
      } 
     } 
     this.id = new CompanyUID(id); 
     this.entityId = this.id; 
    } 

    public String getEntityId() { 
     return entityId.toString(); 
    } 

    public void setEntityId(String entityId) { 
     if (this.id != null && entityId != null) { 
      if (!id.equals(entityId)) { 
       throw new Exception(); 
      } 
     } 

     this.entityId = new CompanyUID(entityId); 
     this.id = this.entityId; 
     } 
    } 
Смежные вопросы