You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@isis.apache.org by "ASF subversion and git services (JIRA)" <ji...@apache.org> on 2016/04/26 20:25:13 UTC
[jira] [Commented] (ISIS-1392) Extend RepositoryService with
persistAndFlush(...) and removeAndFlush(...) methods
[ https://issues.apache.org/jira/browse/ISIS-1392?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15258621#comment-15258621 ]
ASF subversion and git services commented on ISIS-1392:
-------------------------------------------------------
Commit f6e3835c035ebeb8d007d6a6134f64086d93a375 in isis's branch refs/heads/master from [~oscarbou]
[ https://git-wip-us.apache.org/repos/asf?p=isis.git;h=f6e3835 ]
ISIS-1392: Extend RepositoryService with persistAndFlush(...) and removeAndFlush(...) methods
> Extend RepositoryService with persistAndFlush(...) and removeAndFlush(...) methods
> ----------------------------------------------------------------------------------
>
> Key: ISIS-1392
> URL: https://issues.apache.org/jira/browse/ISIS-1392
> Project: Isis
> Issue Type: Improvement
> Components: Core
> Affects Versions: 1.12.1
> Reporter: Oscar Bou
> Assignee: Oscar Bou
> Fix For: 1.13.0
>
>
> It will ease life for newcomers, as the “flush()” invokation is needed for DataNucleus to update “mappedBy” collections, for example, when a new element has been added.
> For Queries, we’re currently invoking always flush(…) before executing it on the persistence layer, but that’s not the default behavior when setting a property, for example.
> So when DN reloads entities collections would not be updated.
> Let's see an example (notice the "this.persistAndFlush(...)" helper method invocation):
> public abstract class Warehouse extends SalesVIPEntity<Marketplace> {
> // {{ ExcludedProducts (Collection)
> @Persistent(mappedBy = "marketplace", dependentElement = "true")
> private SortedSet<MarketplaceExcludedProduct> excludedProducts = new TreeSet<MarketplaceExcludedProduct>();
> @MemberOrder(sequence = "1")
> public SortedSet<MarketplaceExcludedProduct> getExcludedProducts() {
> return this.excludedProducts;
> }
> public void setExcludedProducts(
> final SortedSet<MarketplaceExcludedProduct> excludedProducts) {
> this.excludedProducts = excludedProducts;
> }
> // }}
> // {{ addExcludedProduct (action)
> @Action(semantics = SemanticsOf.IDEMPOTENT)
> @MemberOrder(sequence = "1")
> public MarketplaceExcludedProduct addExcludedProduct(final Product product) {
> MarketplaceExcludedProduct marketplaceExcludedProduct = this
> .findExcludedProduct(product);
> if (marketplaceExcludedProduct == null) {
> marketplaceExcludedProduct = this.factoryService
> .instantiate(MarketplaceExcludedProduct.class);
> }
> this.wrap(marketplaceExcludedProduct).setMarketplace(this);
> this.wrap(marketplaceExcludedProduct).setProduct(product);
> this.persistAndFlush(marketplaceExcludedProduct); <—————————————
> return marketplaceExcludedProduct;
> }
> // }}
> // {{ deleteFromExcludedProducts (action)
> @Action(semantics = SemanticsOf.IDEMPOTENT)
> @MemberOrder(sequence = "1")
> public void deleteFromExcludedProducts(final Product product) {
> final MarketplaceExcludedProduct marketplaceExcludedProduct = this
> .findExcludedProduct(product);
> if (marketplaceExcludedProduct != null) {
> this.repositoryService.remove(marketplaceExcludedProduct);
> this.flushTransaction();
> }
> }
> // }}
> // {{ findExcludedProduct (action)
> @Action(semantics = SemanticsOf.SAFE)
> @MemberOrder(sequence = "1")
> public MarketplaceExcludedProduct findExcludedProduct(final Product product) {
> return this.repositoryService.firstMatch(QueryDefault.create(
> MarketplaceExcludedProduct.class,
> "findByMarketplaceAndProduct", "marketplace", this, "product",
> product));
> }
> // }}
> // {{ findAllProductsExcluded (action)
> @Action(semantics = SemanticsOf.SAFE, hidden = Where.EVERYWHERE)
> public Set<Product> findAllProductsExcluded() {
> return this.getExcludedProducts().stream().map(mep -> mep.getProduct())
> .collect(Collectors.toSet());
> }
> // }}
>
> }
> On the “addExcludedProduct()” action, if the user don’t flush(), in addition to persist(), this test would fail, not containing the given product:
> @Test
> public void addExcludedProduct() {
> // given
> final AmazonMarketplace amazonMarketplace = this.wrapSkipRules(
> this.marketplaceRepository).findOrCreateAmazonMarketplace(
> AmazonMarketplaceLocation.FRANCE);
>
> final Product product = this.wrap(this.productRepository)
> .createProduct(UUID.randomUUID().toString(),
> UUID.randomUUID().toString());
>
> // when
> this.wrap(amazonMarketplace).addExcludedProduct(product);
> // then
> Assertions.assertThat(this.wrapSkipRules(amazonMarketplace).findAllProductsExcluded()).contains(product);
> }
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)