MongoDB @Transactional MongoTransactionManager. .
MongoDB 4.0, mongo-java-driver ( 3.8.2), spring-data-mongodb ( 2.1.0)
MongoConfig
@Configuration
public class MongoConfig extends AbstractMongoConfiguration{
private static final Logger LOG = LoggerFactory.getLogger(MongoConfig.class);
@Value("${spring.data.mongodb.database}")
private String dbName;
@Value("${spring.data.mongodb.host}")
private String dbHost;
@Value("${spring.data.mongodb.port}")
private int dbPort;
@Override
public String getDatabaseName() {
return dbName;
}
@Bean
public MongoClient mongoClient(){
return new MongoClient(dbHost, dbPort);
}
@Bean
public MongoDbFactory mongoDbFactory(){
return new SimpleMongoDbFactory(mongoClient(),dbName);
}
@Bean
public MongoTemplate mongoTemplate() {
DbRefResolver dbRefResolver = new DefaultDbRefResolver(mongoDbFactory());
MappingMongoConverter mappingMongoConverter = new MappingMongoConverter(dbRefResolver, new MongoMappingContext());
mappingMongoConverter.setTypeMapper(new DefaultMongoTypeMapper(null));
MongoTemplate mongoTemplate = new MongoTemplate(mongoDbFactory(),mappingMongoConverter);
return mongoTemplate;
}
public MongoTemplate fetchMongoTemplate(int projectId) {
DbRefResolver dbRefResolver = new DefaultDbRefResolver(mongoDbFactory());
MappingMongoConverter mappingMongoConverter = new MappingMongoConverter(dbRefResolver, new MongoMappingContext());
mappingMongoConverter.setTypeMapper(new DefaultMongoTypeMapper(null));
MongoTemplate mongoTemplate = new MongoTemplate(new SimpleMongoDbFactory(mongoClient(), dbName+"_"+projectId),mappingMongoConverter);
return mongoTemplate;
}
@Bean
public MongoTransactionManager mongoTransactionManager() {
return new MongoTransactionManager(mongoDbFactory());
}
}
mongodb postgreSQL ( mybatis).
@Service
@Component
public class TestRepositoryImpl implements TestRepository{
private static final Logger LOG = LoggerFactory.getLogger(TestRepositoryImpl.class);
@Autowired MongoTemplate mongoTemplate;
@Autowired MongoConfig mongoConfig;
@Autowired UserService userService;
@Override
@Transactional
public void save(Test test){
LOG.info("mongoTemplate <{}>", mongoTemplate.getDb().getName());
int projectId = 100;
if (projectId != 0) {
mongoTemplate = mongoConfig.fetchMongoTemplate(100);
LOG.info("mongoTemplate <{}>", mongoTemplate.getDb().getName());
}
mongoTemplate.insert(test);
IdName idName = new IdName();
idName.setName("test");
mongoTemplate.insert(idName);
User user = new User();
user.setName("Demo");
user.setEmail("XXXX@XXXX.in");
user.setPassword("sdfsdfsdf");
userService.save(user);
}
mongodb, userService.save(user); // .
### SQL: insert into test.user(id,name,email,password values(?,?,?,?)
### Cause: org.postgresql.util.PSQLException: ERROR: syntax error at or near "values"
Position: 50
; bad SQL grammar []; nested exception is org.postgresql.util.PSQLException: ERROR: syntax error at or near "values"
Position: 50] with root cause