Cannot save entity with primitive collection property users

Hi, I’m updating a table entity but it always gets in handleFault, the error is ‘Cannot save an entity with primitive collection property users’. I have updated the ‘CommentThread’ object successfully on client side but when I save the updated object in backendless it shows the error.
kindly help.

I have attached a screenshot of my table.
and here is my Code,

Backendless.Data.of(CommentThreads.class).findById(id, new AsyncCallback<CommentThreads>() {
    @Override
    public void handleResponse(CommentThreads response) {
        currentthread=response;
        progressBar.setVisibility(View.GONE);
        adapter.addToEnd(response.getComments(),true);
    }
    @Override
    public void handleFault(BackendlessFault fault) {
        progressBar.setVisibility(View.GONE);
        makeToast("Error in retrieving");
    }
});


input.setInputListener(new MessageInput.InputListener() {
    @Override
    public boolean onSubmit(final CharSequence inputText) {


        final HelpComments comments = new HelpComments();
        comments.setMessage(inputText.toString());
        comments.setCreator(currentUser);
        Backendless.Data.of(HelpComments.class).save(comments, new AsyncCallback<HelpComments>() {
            @Override
            public void handleResponse(HelpComments response) {


                currentthread.addComment(response);
                Backendless.Data.of(CommentThreads.class).save(currentthread, new AsyncCallback<CommentThreads>() {
                    @Override
                    public void handleResponse(CommentThreads response) {
                        makeToast(inputText.toString());
                        adapter.addToStart(comments, true);
                        makeToast("Message Sent!");
                    }


                    @Override
                    public void handleFault(BackendlessFault fault) {
                        makeToast("Error! Failed to send!");
                        Log.d("thread:",currentthread.getObjectId());
                        Log.d("thread:",currentthread.getOwnerId());
                        Log.d("thread:",currentthread.getComments().toString());
                        Log.d("thread:",currentthread.getHelper().getProperty("name").toString());
                        Log.d("error:",fault.getMessage()+"\nError! Failed to send!\n"+fault.getDetail());
                    }
                });
            }
            @Override
            public void handleFault(BackendlessFault fault) {
                makeToast("Error! Failed to send!");
            }
        });
        return true;
    }
});
and here is the out put of Log
04-06 12:40:44.638 18460-18460/com.example.mubtadanaqvi.stunexus D/thread:: C5D305DF-7687-D056-FFA8-A932A5DFC000
04-06 12:40:44.638 18460-18460/com.example.mubtadanaqvi.stunexus D/thread:: DE1C161F-49AA-CBEE-FFCB-C549DA75D600
04-06 12:40:44.648 18460-18460/com.example.mubtadanaqvi.stunexus D/thread:: [com.example.mubtadanaqvi.stunexus.HelpComments@42662178, com.example.mubtadanaqvi.stunexus.HelpComments@422a5f70, com.example.mubtadanaqvi.stunexus.HelpComments@42329a78]
04-06 12:40:44.648 18460-18460/com.example.mubtadanaqvi.stunexus D/thread:: Jawad

Could you show what the CommentThread looks like? (As text, NOT a screenshot please).

This is the complete class of CommentThreads

package com.example.mubtadanaqvi.stunexus;
import android.util.Log;

import com.backendless.BackendlessUser;
import com.stfalcon.chatkit.commons.models.IDialog;
import com.stfalcon.chatkit.commons.models.IMessage;
import com.stfalcon.chatkit.commons.models.IUser;

import java.util.ArrayList;
import java.util.List;

public class CommentThreads implements IDialog
{
  private java.util.Date created;
  private String ownerId;
  private String objectId;
  private java.util.Date updated;
  private java.util.List<HelpComments> comments;
  private BackendlessUser helper;

  private int unRead=0;
  private IMessage lastMessage;
  private List<IUser> usersList = new ArrayList<>();

  public java.util.Date getCreated()
  {
    return created;
  }
  public String getOwnerId()
  {
    return ownerId;
  }
  public String getObjectId()
  {
    return objectId;
  }
  public java.util.Date getUpdated()
  {
    return updated;
  }
  public java.util.List<HelpComments> getComments()
  {
    return comments;
  }
  public void setComments( java.util.List<HelpComments> comments )
  {
    this.comments = comments;
  }
  public void addComment(HelpComments comments){this.comments.add(comments);}
  public BackendlessUser getHelper()
  {
    return helper;
  }
  public void setHelper( BackendlessUser helper )
  {
    this.helper = helper;
  }


  @Override
  public String getId() {
    return getObjectId();
  }
  @Override
  public String getDialogPhoto() {
    Log.d("test:",getHelper().getProperty("profileImage")+"");
    if (getHelper().getProperty("profileImage")==null)
      return null;
    else
      return getHelper().getProperty("profileImage").toString();
  }
  @Override
  public String getDialogName() {
    return getHelper().getProperty("name").toString();
  }
  @Override
  public List<IUser> getUsers() {
    return this.usersList;
  }
  @Override
  public IMessage getLastMessage() {
    return getComments().get(getComments().size()-1);
  }
  @Override
  public void setLastMessage(IMessage message) {
    this.lastMessage=message;
  }
  @Override
  public int getUnreadCount() {
    return unRead;
  }
  public void addUser(IUser user){
    this.usersList.add(user);
  }

}

What is IUser? The problem is with the following field/property:
private List<IUser> usersList = new ArrayList<>();

It is interface’s property, but it is not added to the database as it is not visible. I created this property after that object in database, does that matter?

Of course it is visible because you have a public getUsers method. As a result, that collection of objects is sent to Backendless where it tries to persist them as well.

how can I restrict some class attributes not to save in database.

Remove get/add methods, make the field public and add the “transient” keyword for the field.

I can’t remove get/add methods, it’s necessary. What if I only add ‘transient’ for the field?

In that case, add the following annotation to the class:

@ExcludeProperty( propertyName = “usersList” )

I have tried the @ExcludeProperty but the problem is still there, It saves the new object but when i try to update it gave the error of “Cannot save entity with primitive collection property users”

Can you post here the code of the CommentsThread class again?

CommentThreads’s class

package com.example.mubtadanaqvi.stunexus;

import android.util.Log;

import com.backendless.BackendlessUser;
import com.stfalcon.chatkit.commons.models.IDialog;
import com.stfalcon.chatkit.commons.models.IMessage;
import com.stfalcon.chatkit.commons.models.IUser;

import java.util.ArrayList;
import java.util.List;

import weborb.service.ExcludeProperties;

@ExcludeProperties( propertyNames = {"usersList","unreadCount","dialogName","dialogPhoto","lastMessage"})
public class CommentThreads implements IDialog
{
  private java.util.Date created;
  private String ownerId;
  private String objectId;
  private java.util.Date updated;
  private java.util.List&lt;HelpComments&gt; comments;
  private BackendlessUser helper;

  private int unRead=0;
  private IMessage lastMessage;
  private List&lt;IUser&gt; usersList = new ArrayList&lt;&gt;();

  public java.util.Date getCreated()
  {
    return created;
  }
  public String getOwnerId()
  {
    return ownerId;
  }
  public String getObjectId()
  {
    return objectId;
  }
  public java.util.Date getUpdated()
  {
    return updated;
  }
  public java.util.List&lt;HelpComments&gt; getComments()
  {
    return comments;
  }
  public void setComments( java.util.List&lt;HelpComments&gt; comments )
  {
    this.comments = comments;
  }
  public void addComment(HelpComments comments){this.comments.add(comments);}
  public BackendlessUser getHelper()
  {
    return helper;
  }
  public void setHelper( BackendlessUser helper )
  {
    this.helper = helper;
  }


  @Override
  public String getId() {
    return getObjectId();
  }
  @Override
  public String getDialogPhoto() {
    Log.d("test:",getHelper().getProperty("profileImage")+"");
    if (getHelper().getProperty("profileImage")==null)
      return null;
    else
      return getHelper().getProperty("profileImage").toString();
  }
  @Override
  public String getDialogName() {
    return getHelper().getProperty("name").toString();
  }
  @Override
  public List&lt;IUser&gt; getUsers() {
    return this.usersList;
  }
  @Override
  public IMessage getLastMessage() {
    return getComments().get(getComments().size()-1);
  }
  @Override
  public void setLastMessage(IMessage message) {
    this.lastMessage=message;
  }
  @Override
  public int getUnreadCount() {
    return unRead;
  }
  public void addUser(IUser user){
    this.usersList.add(user);
  }

}

And Here is HelpComments’s Class

package com.example.mubtadanaqvi.stunexus; 
 
import android.util.Log; 
 
import com.backendless.BackendlessUser; 
import com.stfalcon.chatkit.commons.models.IMessage; 
import com.stfalcon.chatkit.commons.models.IUser; 
 
import java.util.Date; 
 
import weborb.service.ExcludeProperties; 
 
@ExcludeProperties( propertyNames = {"createdAt","id","text","user"}) 
public class HelpComments implements IMessage 
{ 
 private String message; 
 private String ownerId; 
 private String objectId; 
 private java.util.Date created; 
 private java.util.Date updated; 
 private BackendlessUser creator; 
 
 public String getMessage() 
 { 
 return message; 
 } 
 public void setMessage( String message ) 
 { 
 this.message = message; 
 } 
 public String getOwnerId() 
 { 
 return ownerId; 
 } 
 public String getObjectId() 
 { 
 return objectId; 
 } 
 public java.util.Date getCreated() 
 { 
 return created; 
 } 
 public java.util.Date getUpdated() 
 { 
 return updated; 
 } 
 public BackendlessUser getCreator() 
 { 
 return creator; 
 } 
 public void setCreator( BackendlessUser creator ) 
 { 
 this.creator = creator; 
 } 
 
 @Override 
 public String getId() { 
 return getObjectId(); 
 } 
 @Override 
 public String getText() { 
 return getMessage(); 
 } 
 @Override 
 public IUser getUser() { 
 DialogAuthor a= new DialogAuthor(); 
 a.setName(getCreator().getProperty("name").toString()); 
 if (getCreator().getProperty("profileImage")==null) 
 a.setAvtar(null); 
 else 
 a.setAvtar(getCreator().getProperty("profileImage").toString()); 
 Log.d("avtarNew:",getCreator().getProperty("profileImage").toString()); 
 a.setId(getCreator().getObjectId()); 
 return a; 
 } 
 @Override 
 public Date getCreatedAt() { 
 return getCreated(); 
 } 
}


And here is the code how I try to update it,

input.setInputListener(new MessageInput.InputListener() { 
 @Override 
 public boolean onSubmit(final CharSequence inputText) { 
 
 final HelpComments comments = new HelpComments(); 
 comments.setMessage(inputText.toString()); 
 comments.setCreator(currentUser); 
 Backendless.Data.of(HelpComments.class).save(comments, new AsyncCallback&lt;HelpComments&gt;() { 
 @Override 
 public void handleResponse(HelpComments response) { 
 
 currentthread.addComment(response); 
 Backendless.Data.of(CommentThreads.class).save(currentthread, new AsyncCallback&lt;CommentThreads&gt;() { 
 @Override 
 public void handleResponse(CommentThreads response) { 
 makeToast(inputText.toString()); 
 adapter.addToStart(comments, true); 
 makeToast("Message Sent!"); 
 } 
 
 @Override 
 public void handleFault(BackendlessFault fault) { 
 makeToast("Error! Failed to send!"); 
 Log.d("thread:",currentthread.getObjectId()); 
 Log.d("thread:",currentthread.getOwnerId()); 
 Log.d("thread:",currentthread.getComments().toString()); 
 Log.d("thread:",currentthread.getHelper().getProperty("name").toString()); 
 Log.d("error:",fault.getMessage()+"\nError! Failed to send!\n"+fault.getDetail()); 
 } 
 }); 
 } 
 @Override 
 public void handleFault(BackendlessFault fault) { 
 makeToast("Error! Failed to send!"); 
 } 
 }); 
 return true; 
 } 
});


Hello ? I have provided your required information, kindly help me, it’s urgent. It would be a great favor. Thanks in advance.

I have uploaded the said details.
???

@Mark ? are you here ?

Mark is not a bot, he needs to sleep too…))

Mark
p.s. I’ll take a look at it and respond soon

Thanks :slight_smile: waiting for your reply!

Here’s the problem with your code:

When you use the @ExcludeProperty or @ExcludeProperties, the properties you reference in these annotations must have both get and set methods. In both classes (CommentThreads and HelpComments) you define only getters, as a result, our code does not recognize listed properties as “properties”.

Regards,
Mark

I have made changes as you suggested, but it didn’t work.

Here are my updated classes
Comment Threads:

package com.example.mubtadanaqvi.stunexus;

import android.util.Log;

import com.backendless.BackendlessUser;
import com.stfalcon.chatkit.commons.models.IDialog;
import com.stfalcon.chatkit.commons.models.IMessage;
import com.stfalcon.chatkit.commons.models.IUser;

import java.util.ArrayList;
import java.util.List;

import weborb.service.ExcludeProperties;

@ExcludeProperties( propertyNames = {"usersList","unreadCount","dialogName","dialogPhoto","lastMessage","id"})
public class CommentThreads implements IDialog
{
  private java.util.Date created;
  private String ownerId;
  private String objectId;
  private java.util.Date updated;
  private java.util.List&lt;HelpComments&gt; comments;
  private BackendlessUser helper;

  private int unRead=0;
  private String id;
  private String dialogPhoto;
  private String dialogName;
  private IMessage lastMessage;
  private List&lt;IUser&gt; usersList = new ArrayList&lt;&gt;();

  public java.util.Date getCreated()
  {
    return created;
  }
  public String getOwnerId()
  {
    return ownerId;
  }
  public String getObjectId()
  {
    return objectId;
  }
  public java.util.Date getUpdated()
  {
    return updated;
  }
  public java.util.List&lt;HelpComments&gt; getComments()
  {
    return comments;
  }
  public void setComments( java.util.List&lt;HelpComments&gt; comments )
  {
    this.comments = comments;
  }
  public void addComment(HelpComments comments){this.comments.add(comments);}
  public BackendlessUser getHelper()
  {
    return helper;
  }
  public void setHelper( BackendlessUser helper )
  {
    this.helper = helper;
  }


  @Override
  public String getId() {
    return getObjectId();
  }
  public void setId(String s){
    this.id=s;
  }
  @Override
  public String getDialogPhoto() {
    Log.d("test:",getHelper().getProperty("profileImage")+"");
    if (getHelper().getProperty("profileImage")==null)
      return null;
    else
      return getHelper().getProperty("profileImage").toString();
  }
  public void setDialogPhoto(String s){
    this.dialogPhoto=s;
  }
  @Override
  public String getDialogName() {
    return getHelper().getProperty("name").toString();
  }
  public void setDialogName(String s){
    this.dialogName=s;
  }
  @Override
  public List&lt;IUser&gt; getUsers() {
    return this.usersList;
  }
  public void setUsers(List&lt;IUser&gt; users){
      this.usersList=users;
  }
  @Override
  public IMessage getLastMessage() {
    if (getComments().size()>0)
      return getComments().get(getComments().size()-1);
    return null;
  }
  @Override
  public void setLastMessage(IMessage message) {
    this.lastMessage=message;
  }
  @Override
  public int getUnreadCount() {
    return unRead;
  }
  public void setUnreadCount(int i){
      this.unRead=i;
  }

  public void addUser(IUser user){
    this.usersList.add(user);
  }

}

HelpComments:

package com.example.mubtadanaqvi.stunexus;

import android.util.Log;

import com.backendless.BackendlessUser;
import com.stfalcon.chatkit.commons.models.IMessage;
import com.stfalcon.chatkit.commons.models.IUser;

import java.util.Date;

import weborb.service.ExcludeProperties;

@ExcludeProperties( propertyNames = {"createdAt","id","text","user"})
public class HelpComments implements IMessage
{
  private String message;
  private String ownerId;
  private String objectId;
  private java.util.Date created;
  private java.util.Date updated;
  private BackendlessUser creator;


  private String id;
  private String text;
  private IUser user;
  private Date date;

  public String getMessage()
  {
    return message;
  }
  public void setMessage( String message )
  {
    this.message = message;
  }
  public String getOwnerId()
  {
    return ownerId;
  }
  public String getObjectId()
  {
    return objectId;
  }
  public java.util.Date getCreated()
  {
    return created;
  }
  public java.util.Date getUpdated()
  {
    return updated;
  }
  public BackendlessUser getCreator()
  {
    return creator;
  }
  public void setCreator( BackendlessUser creator )
  {
    this.creator = creator;
  }

  @Override
  public String getId() {
    return getObjectId();
  }
  public void setId(String s){
    this.id=s;
  }
  @Override
  public String getText() {
    return getMessage();
  }
  public void setText(String s){
    this.text=s;
  }
  public void setUser(IUser user){
      this.user=user;
  }
  @Override
  public IUser getUser() {
    DialogAuthor a= new DialogAuthor();
    a.setName(getCreator().getProperty("name").toString());
    if (getCreator().getProperty("profileImage")==null)
      a.setAvtar(null);
    else
      a.setAvtar(getCreator().getProperty("profileImage").toString());
    Log.d("avtarNew:",getCreator().getProperty("profileImage").toString());
    a.setId(getCreator().getObjectId());
    return a;
  }
  public void setCreatedAt(Date date){
    this.date=date;
  }
  @Override
  public Date getCreatedAt() {
    return getCreated();
  }
}

When I insert new rows in both tables it works fine but when I update commentThreads it gave error, kindly help
Thanks in advance. Thanks for you cooperation so far. You guys are awesome especially @Mark. :slight_smile:
Waiting for your reply