Spring Data Mongodb Cross store:: MySQL @RelatedDocument(s) не обновляется
Я использую Spring Data Mongodb и Spring data JPA модуль для MySQL.
Я успешно настроен как предложено в справочном документе. Я могу сохранить, но не могу обновить mongodb "RelatedDocuments", хотя могу успешно обновить поля MYSQL.
Отношения сущности похожи
У пользователя (Mysql) есть Адреса (Монго) > Имеет список адресов (очень похоже на пример опроса в ссылке.
Моя ситуация в точности похожа на http://forum.springsource.org/showthread.php?126897-Using-Spring-Data-with-MongoDB-and-MySQL
Версии, которые я использую, следующие
spring-data.mongodb.version = 1.1.0.M1
spring.version = 3.1.2.RELEASE
spring.data.jpa.version = 1.1.0.RELEASE
hibernate.entitymanager.version = 4.1.4.Final
hibernate.jpa-api.version = 1.0.1.Final (using JPA 2.0)
aspectj.version = 1.6.12
Пожалуйста, кто-нибудь может указать, что мне может не хватать, файлы конфигурации, как показано ниже
<!-- Activate Spring Data JPA repository support -->
<jpa:repositories base-package="com.domain.domain.*.repo" factory-class="com.mydomainit.domain.repo.BaseJpaRepositoryFactoryBean"/>
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" p:persistenceXmlLocation="classpath*:META-INF/persistence.xml"
p:persistenceUnitName="spring-jpa" p:dataSource-ref="dataSource" p:jpaVendorAdapter-ref="hibernateVendor" />
<bean id="hibernateVendor" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" p:showSql="true" p:generateDdl="false"
p:database="MYSQL" />
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager" p:entityManagerFactory-ref="entityManagerFactory" />
<tx:annotation-driven mode="aspectj" transaction-manager="transactionManager" />
Конфигурация MongoDB, как показано ниже
<mongo:repositories base-package="com.domain.*.mongorepo" repository-impl-postfix="CustomImpl"
factory-class="com.domain.mongorepo.CommonMongoRepoFactoryBean" />
<mongo:mongo id="mongoRef" host="${mongo.host.name}" port="${mongo.host.port}">
<mongo:options connections-per-host="8" threads-allowed-to-block-for-connection-multiplier="4" connect-timeout="1000" max-wait-time="1500"
auto-connect-retry="true" socket-keep-alive="true" socket-timeout="1500" slave-ok="true" write-number="${mongo.db.w}" write-timeout="${mongo.db.wtimeout}"
write-fsync="${mongo.db.fsync}" />
</mongo:mongo>
<mongo:db-factory id="mongoDbFactory" dbname="${mongo.db.name}" username="${mongo.db.username}" password="${mongo.db.password}"
mongo-ref="mongoRef" />
<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate" c:mongoDbFactory-ref="mongoDbFactory" c:mongoConverter-ref="mappingConverter" />
<bean class="org.springframework.data.mongodb.crossstore.MongoDocumentBacking" factory-method="aspectOf">
<property name="changeSetPersister" ref="mongoChangeSetPersister" />
</bean>
<bean id="mongoChangeSetPersister" class="org.springframework.data.mongodb.crossstore.MongoChangeSetPersister">
<property name="mongoTemplate" ref="mongoTemplate" />
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
<bean class="org.springframework.data.mongodb.core.MongoExceptionTranslator" />
1 ответ
Документация в Интернете довольно старая, что затрудняет настройку; Есть много зависимостей между библиотеками и некоторые API-интерфейсы изменены. Мне удалось заставить его работать следующим образом. Я надеюсь, что это помогает:
pom.xml
<spring.version>3.2.0.RELEASE</spring.version>
<querydsl.version>2.9.0</querydsl.version>
<spring-data-jpa.version>1.2.0.RELEASE</spring-data-jpa.version>
<mongodb.version>1.1.1.RELEASE</mongodb.version>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb</artifactId>
<version>${mongodb.version}</version>
</dependency>
<dependency>
<groupId>com.mysema.querydsl</groupId>
<artifactId>querydsl-mongodb</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb-cross-store</artifactId>
<version>${mongodb.version}</version>
<exclusions>
<exclusion>
<artifactId>jcl-over-slf4j</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.7.0</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjtools</artifactId>
<version>1.7.0</version>
</dependency>
databaseContext.xml
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
<mongo:mongo host="localhost" port="27017" />
<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
<constructor-arg ref="mongo" />
<constructor-arg name="databaseName" value="databasename" />
</bean>
<mongo:repositories base-package="com.yourcompany.repository.mongodb" />
<bean class="org.springframework.data.mongodb.core.MongoExceptionTranslator" />
<bean class="org.springframework.data.mongodb.crossstore.MongoDocumentBacking" factory-method="aspectOf">
<property name="changeSetPersister" ref="mongoChangeSetPersister" />
</bean>
<bean id="mongoChangeSetPersister" class="org.springframework.data.mongodb.crossstore.MongoChangeSetPersister">
<property name="mongoTemplate" ref="mongoTemplate" />
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
Объект продукта (для хранения в MySQL)
@Entity
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id; // MySQL + MongoDB
private double value; // MySQL
@RelatedDocument
private ProductInfo info; // MongoDB
}
Объект ProductInfo (для хранения в MongoDB)
@Document
public class ProductInfo {
@Id
public ObjectId id;
private String name;
private String description;
}
Репозиторий продуктов
@Repository
public interface ProductRepository extends JpaRepository<Product, Long>{}
JUnit Test
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { TestApplicationContext.class })
@TestExecutionListeners({ TransactionalTestExecutionListener.class,
DependencyInjectionTestExecutionListener.class })
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = false)
public class JournalMongoDBServiceIT {
@Resource
ProductRepository productRepository;
@Test
@Transactional
public void crossStoreProduct(){
Product product = new Product();
ProductInfo info = new ProductInfo();
info.setName("Test");
info.setDescription("Test Product");
product.setInfo(info);
productRepository.save(product);
}
@Test
@Transactional
public void crossStoreProductFindAndUpdate(){
Product product = productRepository.findOne(32L);
product.setValue(999L);
product.getInfo().setDescription("Updated description");
productRepository.save(product);
}
}