DATADOC-48 adding basic cross-store features and some tests
This commit is contained in:
@@ -8,6 +8,7 @@ import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.core.convert.ConversionService;
|
||||
import org.springframework.dao.DataAccessException;
|
||||
import org.springframework.dao.DataAccessResourceFailureException;
|
||||
import org.springframework.data.document.mongodb.MongoTemplate;
|
||||
import org.springframework.persistence.support.ChangeSet;
|
||||
import org.springframework.persistence.support.ChangeSetBacked;
|
||||
import org.springframework.persistence.support.ChangeSetPersister;
|
||||
@@ -17,6 +18,7 @@ import com.mongodb.BasicDBObject;
|
||||
import com.mongodb.DB;
|
||||
import com.mongodb.DBCollection;
|
||||
import com.mongodb.DBObject;
|
||||
import com.mongodb.Mongo;
|
||||
import com.mongodb.MongoException;
|
||||
|
||||
//import edu.emory.mathcs.backport.java.util.Arrays;
|
||||
@@ -26,11 +28,11 @@ public class MongoChangeSetPersister implements ChangeSetPersister<Object> {
|
||||
protected final Log log = LogFactory.getLog(getClass());
|
||||
|
||||
@Autowired
|
||||
private DB mongoDb;
|
||||
private MongoTemplate mongoTemplate;
|
||||
|
||||
@Autowired
|
||||
private ConversionService conversionService;
|
||||
|
||||
|
||||
@Override
|
||||
public void getPersistentState(Class<? extends ChangeSetBacked> entityClass, Object id, ChangeSet changeSet)
|
||||
throws DataAccessException, NotFoundException {
|
||||
@@ -38,7 +40,7 @@ public class MongoChangeSetPersister implements ChangeSetPersister<Object> {
|
||||
DBObject q = new BasicDBObject();
|
||||
q.put("_id", id);
|
||||
try {
|
||||
DBObject dbo = mongoDb.getCollection(collection).findOne(q);
|
||||
DBObject dbo = mongoTemplate.getCollection(collection).findOne(q);
|
||||
if (dbo == null) {
|
||||
throw new NotFoundException();
|
||||
}
|
||||
@@ -89,17 +91,18 @@ public class MongoChangeSetPersister implements ChangeSetPersister<Object> {
|
||||
log.info("Flush: entity make persistent; data store will assign id");
|
||||
cs.set("_class", entityClass.getName());
|
||||
String collection = entityClass.getName();
|
||||
DBCollection dbc = mongoDb.getCollection(collection);
|
||||
DBCollection dbc = mongoTemplate.getCollection(collection);
|
||||
DBObject dbo = mapChangeSetToDbObject(cs);
|
||||
if (dbc == null) {
|
||||
dbc = mongoDb.createCollection(collection, dbo);
|
||||
dbc = mongoTemplate.createCollection(collection);
|
||||
}
|
||||
dbc.save(dbo);
|
||||
id = dbo.get(ID_KEY);
|
||||
log.info("Data store assigned id: " + id);
|
||||
} else {
|
||||
log.info("Flush: entity already persistent with id=" + id);
|
||||
String collection = entityClass.getName();
|
||||
DBCollection dbc = mongoDb.getCollection(collection);
|
||||
DBCollection dbc = mongoTemplate.getCollection(collection);
|
||||
DBObject dbo = mapChangeSetToDbObject(cs);
|
||||
if (dbc == null) {
|
||||
throw new DataAccessResourceFailureException("Expected to find a collection named '" + collection +"'. It was not found, so ChangeSet can't be persisted.");
|
||||
|
||||
@@ -1,9 +1,12 @@
|
||||
package org.springframework.data.document.persistence;
|
||||
|
||||
import javax.persistence.Entity;
|
||||
import javax.persistence.Id;
|
||||
|
||||
@Entity
|
||||
public class Account {
|
||||
|
||||
@Id private Long id;
|
||||
|
||||
private String name;
|
||||
|
||||
|
||||
@@ -1,11 +1,8 @@
|
||||
package org.springframework.data.document.persistence;
|
||||
|
||||
import javax.persistence.Entity;
|
||||
|
||||
import org.springframework.persistence.RelatedEntity;
|
||||
import org.springframework.persistence.document.DocumentEntity;
|
||||
|
||||
@Entity
|
||||
@DocumentEntity
|
||||
public class MongoPerson {
|
||||
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
|
||||
<persistence-unit name="test" transaction-type="RESOURCE_LOCAL">
|
||||
<provider>org.hibernate.ejb.HibernatePersistence</provider>
|
||||
<class>org.springframework.data.document.persistence.Account</class>
|
||||
<properties>
|
||||
<property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
|
||||
<!--value='create' to build a new database on each run; value='update' to modify an existing database; value='create-drop' means the same as 'create' but also drops tables when Hibernate closes; value='validate' makes no changes to the database-->
|
||||
<property name="hibernate.hbm2ddl.auto" value="update"/>
|
||||
<property name="hibernate.ejb.naming_strategy" value="org.hibernate.cfg.ImprovedNamingStrategy"/>
|
||||
</properties>
|
||||
</persistence-unit>
|
||||
</persistence>
|
||||
@@ -2,7 +2,9 @@
|
||||
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns:tx="http://www.springframework.org/schema/tx"
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
|
||||
xmlns:jdbc="http://www.springframework.org/schema/jdbc"
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd
|
||||
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
|
||||
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
|
||||
|
||||
<bean id="mongo" class="org.springframework.data.document.mongodb.MongoFactoryBean">
|
||||
@@ -11,9 +13,9 @@
|
||||
</bean>
|
||||
|
||||
<bean id="mongoTemplate" class="org.springframework.data.document.mongodb.MongoTemplate">
|
||||
<constructor-arg ref="mongo" />
|
||||
<constructor-arg value="database" />
|
||||
<property name="defaultCollectionName" value="springdata" />
|
||||
<constructor-arg name="mongo" ref="mongo" />
|
||||
<constructor-arg name="databaseName" value="test" />
|
||||
<constructor-arg name="defaultCollectionName" value="cross-store" />
|
||||
</bean>
|
||||
|
||||
<bean class="org.springframework.data.document.mongodb.MongoExceptionTranslator" />
|
||||
@@ -23,13 +25,17 @@
|
||||
factory-method="aspectOf">
|
||||
<property name="changeSetConfiguration" ref="mongoChangeSetConfiguration"/>
|
||||
</bean>
|
||||
<bean id ="mongoChangeSetPersister" class="org.springframework.persistence.document.MongoChangeSetPersister" />
|
||||
<bean id="mongoChangeSetSynchronizer" class="org.springframework.persistence.support.SimpleReflectiveChangeSetSynchronizer" />
|
||||
<bean id="mongoChangeSetConfiguration" class="org.springframework.persistence.support.ChangeSetConfiguration">
|
||||
<property name="changeSetPersister" ref="mongoChangeSetPersister"/>
|
||||
<property name="changeSetManager" ref="mongoChangeSetSynchronizer"/>
|
||||
</bean>
|
||||
<!-- Needed for ChangeSet persistence -->
|
||||
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean" />
|
||||
|
||||
<bean class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" id="dataSource">
|
||||
<property name="driverClassName" value="${database.driverClassName}"/>
|
||||
<property name="url" value="${database.url}"/>
|
||||
<property name="username" value="${database.username}"/>
|
||||
<property name="password" value="${database.password}"/>
|
||||
</bean>
|
||||
<jdbc:embedded-database id="dataSource" type="HSQL">
|
||||
</jdbc:embedded-database>
|
||||
|
||||
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager" >
|
||||
<property name="entityManagerFactory" ref="entityManagerFactory"/>
|
||||
@@ -38,7 +44,15 @@
|
||||
<tx:annotation-driven mode="aspectj" transaction-manager="transactionManager"/>
|
||||
|
||||
<bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="entityManagerFactory">
|
||||
<property name="persistenceUnitName" value="test"/>
|
||||
<property name="dataSource" ref="dataSource"/>
|
||||
<property name="jpaVendorAdapter">
|
||||
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
|
||||
<property name="showSql" value="true"/>
|
||||
<property name="generateDdl" value="true"/>
|
||||
<property name="databasePlatform" value="org.hibernate.dialect.HSQLDialect"/>
|
||||
</bean>
|
||||
</property>
|
||||
</bean>
|
||||
|
||||
</beans>
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
log4j.rootCategory=INFO, stdout
|
||||
|
||||
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
|
||||
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
|
||||
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - <%m>%n
|
||||
|
||||
log4j.category.org.springframework=INFO
|
||||
log4j.category.org.springframework.data=DEBUG
|
||||
log4j.category.org.springframework.persistence=DEBUG
|
||||
|
||||
log4j.category.org.hibernate.SQL=DEBUG
|
||||
# for debugging datasource initialization
|
||||
# log4j.category.test.jdbc=DEBUG
|
||||
Reference in New Issue
Block a user