Spring Data Mongodb Cross store:: With MySQL @RelatedDocument(s) not updating

回眸只為那壹抹淺笑 提交于 2019-12-03 20:40:40

The documentation in Internet is quite old, which makes it is difficult to configure; there are many dependencies between libraries and some apis changed. I managed to make it work as follows. I hope it helps:

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>

Product Object (to be stored in 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 Object (to be stored in MongoDB)

@Document
public class ProductInfo {
    @Id
    public ObjectId id;
    private String name;
    private String description;
}

Product Repository

@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);
    }
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!