Page 1 of 1

about Entity-type-selection

Posted: Tue Jun 30, 2015 11:41 pm
by kunner
Hello.
I'm studying BLC 4.0.
and I performing BLC tutorial(http://www.broadleafcommerce.com/docs/c ... -selection) now.

I've extended Customer entity, and I've switched default customer type by HcCustomerController like below.
(I tested various situation, so my custom customer entity looks so funny :))

Code: Select all

@Controller("customHcCustomerController")
@RequestMapping("/"+HcCustomerController.SECTION_KEY)
public class HcCustomerController extends AdminBasicEntityController {
   
   protected static final String SECTION_KEY = "customer";
   
   @Override
   protected String getSectionKey(Map<String, String> pathVars) {
      if (super.getSectionKey(pathVars) != null){
         return super.getSectionKey(pathVars);
      }
      
      return SECTION_KEY;
   }

   protected String getDefaultEntityType(){
      return HcCustomerImpl.class.getName();
   }
}   



Here is HcCustomerImpl(it extends HcCustomer - it was omitted)

Code: Select all

@Entity
@Table(name = "HC_CUSTOMER")
@AdminPresentationClass(populateToOneFields = PopulateToOneFieldsEnum.TRUE, friendlyName = "CustomerImpl_baseCustomer")
@DirectCopyTransform({
    @DirectCopyTransformMember(templateTokens = DirectCopyTransformTypes.PREVIEW, skipOverlaps=true),
    @DirectCopyTransformMember(templateTokens = DirectCopyTransformTypes.MULTITENANT_SITE)
})
public class HcCustomerImpl extends CustomerImpl implements HcCustomer {
   private static final Log LOG = LogFactory.getLog(HcCustomerImpl.class);
   
   private static final long serialVersionUID = 6545097668293683751L;

    @Column(name = "NUM_SAUCES_BOUGHT")
    @AdminPresentation(friendlyName = "CustomerImpl_NUM_SAUCES_BOUGHT", order = 1000, group = "CustomerImpl_Customer2",
    prominent = true, gridOrder = 500)
    protected Integer numSaucesBought = 0;

    @Column(name = "TOTAL_HEAT_RATING")
    @AdminPresentation(friendlyName = "CustomerImpl_TOTAL_HEAT_RATING", order = 2000, group = "CustomerImpl_Customer2",
    prominent = true, gridOrder = 900)
    protected Integer totalHeatRating = 0;

    @Override
    public Integer getAverageHeatRatingBought() {
        if (numSaucesBought == null || numSaucesBought == 0) {
            return 0;
        }
        return totalHeatRating / numSaucesBought;
    }

    @Override
    public Integer getTotalHeatRating() {
        return totalHeatRating;
    }

    @Override
    public void setTotalHeatRating(Integer totalHeatRating) {
        this.totalHeatRating = totalHeatRating;
    }
   
    @Override
    public Integer getNumSaucesBought() {
        return numSaucesBought;
    }

    @Override
    public void setNumSaucesBought(Integer numSaucesBought) {
        this.numSaucesBought = numSaucesBought;
    }
   

    @OneToMany(mappedBy = "customer", targetEntity = HcCustomerAttrImpl.class, cascade = { CascadeType.ALL }, orphanRemoval = true)
    @Cache(usage=CacheConcurrencyStrategy.NONSTRICT_READ_WRITE, region="blStandardElements")
    @MapKey(name="name")
    @BatchSize(size = 50)
    @AdminPresentationMap(friendlyName = "HcCustomerAttrImpl_Attribute_Name",
            deleteEntityUponRemove = true
            , keyPropertyFriendlyName = "HcCustomerAttrImpl_Attribute_Key"
            , valuePropertyFriendlyName = "HcCustomerAttrImpl_Attribute_Value"
            , forceFreeFormKeys = false
            , keys={
             @AdminPresentationMapKey(keyName = "ON", friendlyKeyName="HcCustomerAttrImpl_Attribute_Key_ON"),
             @AdminPresentationMapKey(keyName = "OFF", friendlyKeyName="HcCustomerAttrImpl_Attribute_Key_OFF")
             }

           
    )
    protected Map<String, HcCustomerAttr> hcCustomerAttr = new HashMap<String, HcCustomerAttr>();
   
    @Override
    public Map<String, HcCustomerAttr> getHcCustomerAttr() {
        return hcCustomerAttr;
    }

    @Override
    public void setHcCustomerAttr(Map<String, HcCustomerAttr> hcCustomerAttr) {
        this.hcCustomerAttr = hcCustomerAttr;
    }
   
    @Column(name = "TEST_BOOL")
    @AdminPresentation(friendlyName = "HcCustomerAttrImpl_TEST_BOOL", order = 4000, prominent = false)
    protected boolean customerTestBool = true;

    @Override
    public boolean getCustomerTestBool(){
       return customerTestBool;
    };
   
    @Override
    public void setCustomerTestBool(boolean customerTestBool){
       this.customerTestBool = customerTestBool;
    };
   
    @ManyToOne(targetEntity = LocaleImpl.class, optional = false)
    @JoinColumn(name = "LOCALE_CODE")
    @AdminPresentation(friendlyName = "HcCustomerAttrImpl_LOCALE", order = 2, prominent = false)
    @AdminPresentationToOneLookup(lookupDisplayProperty = "friendlyName", lookupType = LookupType.DROPDOWN)
    protected Locale hcCustomerLocale;
   
    @Override
    public Locale getHcCustomerLocale() {
        return customerLocale;
    }

    @Override
    public void setHcCustomerLocale(Locale customerLocale) {
        this.customerLocale = customerLocale;
    }
   
    @ManyToOne(targetEntity = PageTemplateImpl.class)
    @JoinColumn(name = "PAGE_TMPLT_ID")
    @AdminPresentation(friendlyName = "PageImpl_Page_Template", order = 4000,
        group = "Custom Page", groupOrder = 100, prominent = false,
        requiredOverride = RequiredOverride.REQUIRED)
    @AdminPresentationToOneLookup(lookupDisplayProperty = "templateName")
    protected PageTemplate pageTemplate;
   
    @Override
    public PageTemplate getHCPageTemplate() {
        return pageTemplate;
    }

    @Override
    public void setHCPageTemplate(PageTemplate pageTemplate) {
        this.pageTemplate = pageTemplate;
    }
   

    @OneToMany(mappedBy = "hcCustomer", targetEntity = HcCustomerAssetImpl.class, cascade = { CascadeType.ALL }, orphanRemoval = true)
    @MapKey(name = "key")         
    @Cache(usage = CacheConcurrencyStrategy.READ_WRITE, region = "hcCustomer")
    @BatchSize(size = 50)
    @AdminPresentationMap(friendlyName = "HcCustomerImpl_Asset",
        keyPropertyFriendlyName = "HcCustomerImpl_Asset_Key",
        deleteEntityUponRemove = true,
        mediaField = "media.url",
        toOneTargetProperty = "media",
        toOneParentProperty = "hcCustomer",
        forceFreeFormKeys = true,
        excluded = true   
    )
    @AdminPresentationMapFields(
          toOneTargetProperty = "media",
            toOneParentProperty = "hcCustomer",
          mapDisplayFields = {
            @AdminPresentationMapField(
                    fieldName = "primary",         // old_value is primary
                    fieldPresentation = @AdminPresentation(fieldType = SupportedFieldType.MEDIA,
                            group = "HcCustomerImpl_Asset_customer_photo",
                            groupOrder = 1000,
                            order = 3000,
                            friendlyName = "HcCustomerImpl_Asset_customer")
            )
    })
    protected Map<String, HcCustomerAsset> hcCustomerAssetMap = new HashMap<String, HcCustomerAsset>();
   
    @Override
    public Map<String, HcCustomerAsset> getHcCustomerAssetMap() {
        return hcCustomerAssetMap;
    }

    @Override
    public void setHcCustomerAssetMap(Map<String, HcCustomerAsset> hcCustomerAssetMap) {
        this.hcCustomerAssetMap = hcCustomerAssetMap;
    }
}





And when I tried to add customer in Admin, I didn't need to select any type.
It was successful.

But there is another problem.
I couldn't add customer entity, cause of E-mail validation.

When I tried to click save button to submit entity-form, re-builded Entityform shown Error msg like below.
A customer already exists with this username

But the email address was not duplicated(I wrote a fresh email-address!)

The attempt to save customer entity was success, when I did'nt perform entity-type-selection.
However, once I attach new controller for customer entity - it's failed to save.

If I didn't fill Email address field, It committed successfully.
And update/delete works very well, too.
(But when update, Email duplicate validation did'nt work)



Sorry to too long article.

Now let me ask, is there an additional code or setting for entity-type-selection?
or did I mistake?



Thanks.
and Thanks to BLC.

Re: about Entity-type-selection

Posted: Wed Jul 01, 2015 12:08 am
by kunner
Here is additional information about this error.

When I attach image - using BLC-Asset, error appeared.
If I didn't attach image, It works well.

Here is my HcCustomerAssetImpl (omitted HcCustomerAsset too)

Code: Select all

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@Table(name = "HC_CUSTOMER_asset_MAP")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE, region="hcCustomer")
@AdminPresentationClass(excludeFromPolymorphism = false, populateToOneFields = PopulateToOneFieldsEnum.TRUE)
@DirectCopyTransform({
    @DirectCopyTransformMember(templateTokens = DirectCopyTransformTypes.SANDBOX, skipOverlaps=true),
    @DirectCopyTransformMember(templateTokens = DirectCopyTransformTypes.MULTITENANT_CATALOG)
})
public class HcCustomerAssetImpl implements HcCustomerAsset, Media, MultiTenantCloneable<HcCustomerAssetImpl>{
   
   private static final Log LOG = LogFactory.getLog(HcCustomerAssetImpl.class);
   
   /** The Constant serialVersionUID. */
    private static final long serialVersionUID = 1L;

    public HcCustomerAssetImpl(HcCustomer hcCustomer, Media media, String key){
       this.hcCustomer = hcCustomer;
       this.media = media;
       this.key = key;
    }
   
    public HcCustomerAssetImpl(){
       //Hibernate default
    }
   
    @Id
    @GeneratedValue(generator = "HcCustomerAssetId")
    @GenericGenerator(
            name="HcCustomerAssetId",
            strategy="org.broadleafcommerce.common.persistence.IdOverrideTableGenerator",
            parameters = {
                @Parameter(name="segment_value", value="HcCustomerAssetImpl"),
                @Parameter(name="entity_name", value="com.mycompany.tutorial.HcCustomerAssetImpl")
            }
     )
     @Column(name = "HcCustomer_Asset_ID")
     protected Long id;
           
    @ManyToOne(targetEntity = HcCustomerImpl.class, optional=false, cascade = CascadeType.REFRESH)
    @JoinColumn(name = "CUSTOMER_ID")
    @AdminPresentation(excluded = true)
    protected HcCustomer hcCustomer;
   
    @ManyToOne(targetEntity = MediaImpl.class, cascade = CascadeType.ALL)
    @JoinColumn(name = "MEDIA_ID")
    @ClonePolicy
    protected Media media;
   
    @Column(name = "MAP_KEY", nullable=false)
    @AdminPresentation(visibility = VisibilityEnum.HIDDEN_ALL)
    protected String key;
   
    @Override
    public Long getId(){
       return id;   
    }
   
    @Override
    public void setId(Long id) {
        this.id = id;
    }
   
    @Override
    public HcCustomer getHcCustomer(){
       return hcCustomer;   
    }
   
    @Override
    public void setHcCustomer(HcCustomer hcCustomer){
       this.hcCustomer = hcCustomer;
    }
   
    @Override
    public Media getMedia() {
        return media;
    }

    @Override
    public void setMedia(Media media) {
        this.media = media;
    }


    @Override
    public String getUrl() {
        createEntityInstance();
        return media.getUrl();
    }

    @Override
    public void setUrl(String url) {
        createEntityInstance();
        media.setUrl(url);
    }

    @Override
    public String getTitle() {
        createEntityInstance();
        return media.getTitle();
    }

    @Override
    public void setTitle(String title) {
        createEntityInstance();
        media.setTitle(title);
    }

    @Override
    public String getAltText() {
        createEntityInstance();
        return media.getAltText();
    }

    @Override
    public void setAltText(String altText) {
        createEntityInstance();
        media.setAltText(altText);
    }

    @Override
    public String getTags() {
        createEntityInstance();
        return media.getTags();
    }

    @Override
    public void setTags(String tags) {
        createEntityInstance();
        media.setTags(tags);
    }

    protected void createEntityInstance() {
        if (media == null) {
            media = new MediaImpl();
        }
    }

    @Override
    public boolean isUnwrappableAs(Class unwrapType) {
        return Media.class.equals(unwrapType);
    }

    @Override
    public <T> T unwrap(Class<T> unwrapType) {
        if (isUnwrappableAs(unwrapType)) {
            return (T) media;
        }
        throw new UnknownUnwrapTypeException(unwrapType);
    }

   @Override
   public String getKey() {
      return key;
   }

   @Override
   public void setKey(String key) {
      this.key = key;
      
   }

   @Override
   public <G extends HcCustomerAssetImpl> CreateResponse<G> createOrRetrieveCopyInstance(MultiTenantCopyContext context) throws CloneNotSupportedException {
      
      CreateResponse<G> createResponse = context.createOrRetrieveCopyInstance(this);
      if (createResponse.isAlreadyPopulated()) {
            return createResponse;
        }
      
      HcCustomerAssetImpl cloned = createResponse.getClone();
      if (media != null){
         cloned.setMedia(((MediaImpl) media).createOrRetrieveCopyInstance(context).getClone());
      }
      cloned.setAltText(getAltText());
      cloned.setKey(key);
      if (hcCustomer != null){
         cloned.setHcCustomer(getHcCustomer());
      }
      cloned.setTags(getTags());
      cloned.setUrl(getUrl());
        cloned.setTitle(getTitle());
      
      return createResponse;
      
      
   }


   
   
}




Fill out Email or attach Image, the system makes me choose only one.
:oops:

Re: about Entity-type-selection

Posted: Wed Jul 15, 2015 9:45 pm
by kunner
Is there anyone who can help?

I couldn't resolve it.

Re: about Entity-type-selection

Posted: Mon Jul 27, 2015 4:46 am
by phillipuniverse
Hm all of that looks right. Exactly what version of Broadleaf are you on?

Re: about Entity-type-selection

Posted: Mon Jul 27, 2015 6:00 am
by kunner
Thanks, phillip.

I'm using BLC 4.0 Ga, community :)