GemfireRepository 插入 List(Domain Class)
GemfireRepository inserting List(Domain Class)
我有场景需要使用 GemfireRepository
插入域列表 类 但它不可用,因为它在 Cassandra 中可用...
@Autowired
private CassandraOperations cassandraTemplate;
cassandraTemplate.insert(List<DomainClass>);
后续问题...
@EnableAsync
public class GenericWriter<K, V> extends CacheWriterAdapter<K, V> implements Declarable {
private static Logger log = LoggerFactory.getLogger(GenericWriter.class);
@Autowired
private CassandraOperations cassandraOperations;
ExecutorService executor = null;
/**
* Cache Writer get called before any event occurs on the cache, where in
* EntryEvent interface reference has the helper methods
*/
@Override
@Async
public void beforeCreate(EntryEvent<K, V> e) throws CacheWriterException {
String eventOperation = e.getOperation().toString();
log.info("#####inside before create#####");
executor = Executors.newSingleThreadExecutor();
executor.submit(() -> {
log.info("****inside submit*****");
if (eventOperation.equals("CREATE")) {
log.info("Cache Writer for " + e.getRegion().getName() + " over Cassandra is activated"
+ e.getNewValue());
try {
cassandraOperations.insert(e.getNewValue());
} catch (CassandraConnectionFailureException | CassandraWriteTimeoutException
| CassandraInternalException cassException) {
cassException.printStackTrace();
log.info("Cassandra Exception:" + cassException.toString());
}
catch (Exception ex){
log.info("Exception--------------------"+ex.getStackTrace());
ex.printStackTrace();
}
}
});
executor.shutdown();
}
@Override
public void init(Properties arg0) {
// TODO Auto-generated method stub
}
}
Vigneshwaran-
首先,你不是在比较苹果和苹果。
CassandraOperations
不是 SDG 的 GemfireRepository
的 "equivalent"。那将是 SDG 的 GemfireOperations
。
Spring Data GemFire 的 o.s.d.g.repository.GemfireRepository
接口是 Spring Data Common 的 o.s.d.repository.CrudRepository
接口和 Spring Data Common 的 Repository
infrastructure/abstraction 的一部分,它实现了 数据访问对象 (DAO) 模式,通过简单的接口定义具有基本的 CRUD 和查询功能。有关详细信息,请参阅 here。
Spring Data Cassandra 还通过 CassandraRepository
扩展和实现了 SD Commons 的存储库基础设施。因此,CassandraRepository
和GemfireRepository
等价。
现在,至于 "inserting a list of application domain types"...好吧,如果您使用的是 SDG 的 GemfireOperations
(由 SDG 的 GemfireTemplate
) you can insert multiple application domain objects into GemFire using the gemfireTemplate.putAll(:Map<K, V>)
操作实现。
如您所见,putAll(..)
方法接受一个 java.util.Map
,其中键是标识符,值是您的应用程序域对象。
让我们暂时假设您有一个 Customer
应用程序域类型...
@Region("Customers")
class Customer {
@Id
private Long id;
private String name;
// constructor(s), getter/setters, equals, hashCode, toString, etc
}
那么你可以...
@Resource(name = "Customers"
private Region<Long, Customer> customers;
...
private GemfireOperations customersTemplate = new GemfireTemplate(customers);
...
Customer jonDoe = new Customer(1L, "Jon Doe");
Customer janeDoe = new Customer(2L, "Jane", "Doe");
Map<Long, Customer> customers = ...;
customers.put(jonDoe.getId(), jonDoe);
customers.put(janeDoe.getId(), janeDoe);
customersTemplate.putAll(customers);
但是,这是相当多的样板代码。使用 SDG 的存储库抽象和扩展要简单得多。首先你会像这样定义一个 CustomerRepository
...
public interface CustomerRepository extends GemfireRepository<Customer, Long> { ... }
然后您可以使用...
保存 Customers
的 java.util.List
List<Customer> customers = Arrays.asList(jonDoe, janeDoe);
customerRepository.save(customers);
记住,SDG 的 GemfireRepository
扩展了 SD Common 的 o.s.d.repository.CrudRepository
. SD Common's o.s.d.repository.CrudRepository
has a save(:Iterable<S>)
方法,其中...
S
在 CrudRepository<T, ID>
中扩展了 T
。
并且,由于 java.util.List
是一个 Iterable<E>
,您可以使用一种方法来保存多个实体或特定类型的应用程序域对象(例如 Customer
)。
SDG Repository
基础设施扩展的另一个便利功能是...
它将检查应用程序域类型(例如 Customer
),它会看到 Customer
被注释为 SDG 的 @Region
annotation and use the value to determine the GemFire Region
(i.e. "Customers" from above) in which to persist entities of type Customer
and also use the @Id
annotated 字段(或 属性,例如 getId()
on Customer
) 以确定实体将映射到的 "Customers" 区域中的 "key"。
无论如何,您只是深入挖掘了一点,阅读 docs and look at the API。
都在那里。
希望对您有所帮助!
-约翰
我有场景需要使用 GemfireRepository
插入域列表 类 但它不可用,因为它在 Cassandra 中可用...
@Autowired
private CassandraOperations cassandraTemplate;
cassandraTemplate.insert(List<DomainClass>);
后续问题...
@EnableAsync
public class GenericWriter<K, V> extends CacheWriterAdapter<K, V> implements Declarable {
private static Logger log = LoggerFactory.getLogger(GenericWriter.class);
@Autowired
private CassandraOperations cassandraOperations;
ExecutorService executor = null;
/**
* Cache Writer get called before any event occurs on the cache, where in
* EntryEvent interface reference has the helper methods
*/
@Override
@Async
public void beforeCreate(EntryEvent<K, V> e) throws CacheWriterException {
String eventOperation = e.getOperation().toString();
log.info("#####inside before create#####");
executor = Executors.newSingleThreadExecutor();
executor.submit(() -> {
log.info("****inside submit*****");
if (eventOperation.equals("CREATE")) {
log.info("Cache Writer for " + e.getRegion().getName() + " over Cassandra is activated"
+ e.getNewValue());
try {
cassandraOperations.insert(e.getNewValue());
} catch (CassandraConnectionFailureException | CassandraWriteTimeoutException
| CassandraInternalException cassException) {
cassException.printStackTrace();
log.info("Cassandra Exception:" + cassException.toString());
}
catch (Exception ex){
log.info("Exception--------------------"+ex.getStackTrace());
ex.printStackTrace();
}
}
});
executor.shutdown();
}
@Override
public void init(Properties arg0) {
// TODO Auto-generated method stub
}
}
Vigneshwaran-
首先,你不是在比较苹果和苹果。
CassandraOperations
不是 SDG 的 GemfireRepository
的 "equivalent"。那将是 SDG 的 GemfireOperations
。
Spring Data GemFire 的 o.s.d.g.repository.GemfireRepository
接口是 Spring Data Common 的 o.s.d.repository.CrudRepository
接口和 Spring Data Common 的 Repository
infrastructure/abstraction 的一部分,它实现了 数据访问对象 (DAO) 模式,通过简单的接口定义具有基本的 CRUD 和查询功能。有关详细信息,请参阅 here。
Spring Data Cassandra 还通过 CassandraRepository
扩展和实现了 SD Commons 的存储库基础设施。因此,CassandraRepository
和GemfireRepository
等价。
现在,至于 "inserting a list of application domain types"...好吧,如果您使用的是 SDG 的 GemfireOperations
(由 SDG 的 GemfireTemplate
) you can insert multiple application domain objects into GemFire using the gemfireTemplate.putAll(:Map<K, V>)
操作实现。
如您所见,putAll(..)
方法接受一个 java.util.Map
,其中键是标识符,值是您的应用程序域对象。
让我们暂时假设您有一个 Customer
应用程序域类型...
@Region("Customers")
class Customer {
@Id
private Long id;
private String name;
// constructor(s), getter/setters, equals, hashCode, toString, etc
}
那么你可以...
@Resource(name = "Customers"
private Region<Long, Customer> customers;
...
private GemfireOperations customersTemplate = new GemfireTemplate(customers);
...
Customer jonDoe = new Customer(1L, "Jon Doe");
Customer janeDoe = new Customer(2L, "Jane", "Doe");
Map<Long, Customer> customers = ...;
customers.put(jonDoe.getId(), jonDoe);
customers.put(janeDoe.getId(), janeDoe);
customersTemplate.putAll(customers);
但是,这是相当多的样板代码。使用 SDG 的存储库抽象和扩展要简单得多。首先你会像这样定义一个 CustomerRepository
...
public interface CustomerRepository extends GemfireRepository<Customer, Long> { ... }
然后您可以使用...
保存Customers
的 java.util.List
List<Customer> customers = Arrays.asList(jonDoe, janeDoe);
customerRepository.save(customers);
记住,SDG 的 GemfireRepository
扩展了 SD Common 的 o.s.d.repository.CrudRepository
. SD Common's o.s.d.repository.CrudRepository
has a save(:Iterable<S>)
方法,其中...
S
在 CrudRepository<T, ID>
中扩展了 T
。
并且,由于 java.util.List
是一个 Iterable<E>
,您可以使用一种方法来保存多个实体或特定类型的应用程序域对象(例如 Customer
)。
SDG Repository
基础设施扩展的另一个便利功能是...
它将检查应用程序域类型(例如 Customer
),它会看到 Customer
被注释为 SDG 的 @Region
annotation and use the value to determine the GemFire Region
(i.e. "Customers" from above) in which to persist entities of type Customer
and also use the @Id
annotated 字段(或 属性,例如 getId()
on Customer
) 以确定实体将映射到的 "Customers" 区域中的 "key"。
无论如何,您只是深入挖掘了一点,阅读 docs and look at the API。
都在那里。
希望对您有所帮助!
-约翰