MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Menyesuaikan nama kacang repositori Spring Data untuk digunakan dengan banyak sumber data

Buat antarmuka repositori Anda dengan @NoRepositoryBean , kami akan mengirimkannya sendiri:

@NoRepositoryBean
public interface ModelMongoRepository extends MongoRepository<Model, String> {
}      

Kemudian, dalam @Configuration class, buat instance 2 biji repositori menggunakan MongoRepositoryFactoryBean . Kedua repositori akan mengembalikan antarmuka Spring Data Repository yang sama, tetapi kami akan menetapkan MongoOperations yang berbeda. (yaitu:detail basis data):

@Configuration
@EnableMongoRepositories
public class MongoConfiguration {

    @Bean
    @Qualifier("one")
    public ModelMongoRepository modelMongoRepositoryOne() throws DataAccessException, Exception {
        MongoRepositoryFactoryBean<ModelMongoRepository, Model, String> myFactory = new MongoRepositoryFactoryBean<ModelMongoRepository, Model, String>();
        myFactory.setRepositoryInterface(ModelMongoRepository.class);
        myFactory.setMongoOperations(createMongoOperations("hostname1", 21979, "dbName1", "username1", "password1"));
        myFactory.afterPropertiesSet();
        return myFactory.getObject();
    }

    @Bean
    @Qualifier("two")
    public ModelMongoRepository modelMongoRepositoryTwo() throws DataAccessException, Exception {
        MongoRepositoryFactoryBean<ModelMongoRepository, Model, String> myFactory = new MongoRepositoryFactoryBean<ModelMongoRepository, Model, String>();
        myFactory.setRepositoryInterface(ModelMongoRepository.class);
        myFactory.setMongoOperations(createMongoOperations("hostname2", 21990, "dbName2", "username2", "password2"));
        myFactory.afterPropertiesSet();
        return myFactory.getObject();
    }

    private MongoOperations createMongoOperations(String hostname, int port, String dbName, String user, String pwd) throws DataAccessException, Exception {
        MongoCredential mongoCredentials = MongoCredential.createScramSha1Credential(user, dbName, pwd.toCharArray());
        MongoClient mongoClient = new MongoClient(new ServerAddress(hostname, port), Arrays.asList(mongoCredentials));
        Mongo mongo = new SimpleMongoDbFactory(mongoClient, dbName).getDb().getMongo();
        return new MongoTemplate(mongo, dbName);
    }
    //or this one if you have a connection string
    private MongoOperations createMongoOperations(String dbConnection) throws DataAccessException, Exception {
        MongoClientURI mongoClientURI = new MongoClientURI(dbConnection);
        MongoClient mongoClient = new MongoClient(mongoClientURI);
        Mongo mongo = new SimpleMongoDbFactory(mongoClient, mongoClientURI.getDatabase()).getDb().getMongo();
        return new MongoTemplate(mongo, mongoClientURI.getDatabase());
    }
}

Anda sekarang memiliki 2 kacang dengan @Qualifier yang berbeda nama, masing-masing dikonfigurasi untuk database yang berbeda, dan menggunakan model yang sama.

Anda dapat menyuntikkannya menggunakan @Qualifier :

@Autowired
@Qualifier("one")
private ModelMongoRepository mongoRepositoryOne;

@Autowired
@Qualifier("two")
private ModelMongoRepository mongoRepositoryTwo;

Untuk mempermudah, saya telah mengkodekan nilai-nilai di kelas konfigurasi, tetapi Anda dapat memasukkannya dari properti di application.properties/yml.

Inilah modifikasi jika Anda ingin membuat implementasi khusus tanpa kehilangan manfaat dari repositori antarmuka data pegas. spesifikasinya begini:

Buat antarmuka baru, yang secara teknis tidak ada hubungannya dengan data pegas, antarmuka lama yang bagus:

public interface CustomMethodsRepository {
    public void getById(Model model){
}

Minta antarmuka repositori Anda memperluas antarmuka baru ini:

@NoRepositoryBean
public interface ModelMongoRepository extends MongoRepository<Model, String>, CustomMethodsRepository {
} 

Kemudian, buat kelas implementasi Anda, yang hanya mengimplementasikan antarmuka non-data musim semi Anda:

public class ModelMongoRepositoryImpl  implements CustomModelMongoRepository {
    private MongoOperations mongoOperations;

    public ModelMongoRepositoryImpl(MongoOperations mongoOperations) {
        this.mongoOperations = mongoOperations;
    }
    public void getById(Model model){
        System.out.println("test");
    }
}

Ubah konfigurasi Java untuk menambahkan myFactory.setCustomImplementation(new ModelMongoRepositoryImpl()); :

@Bean
@Qualifier("one")
public ModelMongoRepository modelMongoRepositoryOne() throws DataAccessException, Exception {
    MongoRepositoryFactoryBean<ModelMongoRepository, Model, String> myFactory = new MongoRepositoryFactoryBean<ModelMongoRepository, Model, String>();
    MongoOperations mongoOperations = createMongoOperations("hostname1", 21979, "dbName1", "usdername1", "password1");
    myFactory.setCustomImplementation(new ModelMongoRepositoryImpl(mongoOperations));
    myFactory.setRepositoryInterface(ModelMongoRepository.class);
    myFactory.setMongoOperations(mongoOperations);

    myFactory.afterPropertiesSet();
    return myFactory.getObject();
}

Jika Anda tidak memasang kabel repositori secara manual melalui konfigurasi Java, implementasi ini HARUS diberi nama ModelMongoRepositoryImpl untuk mencocokkan antarmuka ModelMongoRepository +"Impl" . Dan itu akan ditangani secara otomatis pada musim semi.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Pembacaan DBname.system.indexes gagal pada cluster Atlas oleh mongobee setelah terhubung

  2. next.js dan mongodb atlas - mendapatkan Koneksi % dari batas yang dikonfigurasi telah melampaui 80 peringatan

  3. cara yang disarankan untuk menginstal mongodb di pohon kacang elastis

  4. Menggabungkan dua $exists en MongoDB .find

  5. Cara mendapatkan daftar pengguna yang ulang tahun hari ini di MongoDB