You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@cassandra.apache.org by Carlos Scheidecker <na...@gmail.com> on 2014/09/21 05:28:10 UTC

How to map a set field?

Hello all,

I have the following table:

CREATE TABLE userprincipal (
  userid timeuuid,
  username varchar,
  hashedpassword blob,
  authorities set<text>,
  accountnonexpired boolean,
  accountnonlocked boolean,
  credentialsnonexpired boolean,
  enabled boolean,
  PRIMARY KEY(username)
);

Now, I have an UserPrincipalObject to which Authorities ia a HashSet of
UserAuthority Spring objects. If the system does the setting through that
object, I update my own set of Strings called sAuthorities.

On the database I save the sAuthorities which is what I map. But on the
object on the memory I mape the set of UserAuthorities

My UserPrincipalObject is as follows:

@Table(name = "userprincipal")
public class UserPrincipal implements UserDetails, CredentialsContainer,
Cloneable {

@Transient
private static final long serialVersionUID = 1L;

@PartitionKey
@Column(name = "username")
private String userName;

@Column(name = "userid")
private UUID userID;

@Column(name = "hashedpassword")
private ByteBuffer hashedPassword;

@Column(name = "sauthorities")
private Set<String> sAuthorities = new HashSet<String>();
 @Transient
@FrozenValue
Set<UserAuthority> authorities = new HashSet<UserAuthority>();

@Column(name = "accountnonexpired")
private boolean accountNonExpired;

@Column(name = "accountnonlocked")
private boolean accountNonLocked;

@Column(name = "credentialsnonexpired")
private boolean credentialsNonExpired;

@Column(name = "enabled")
private boolean enabled;

The setters for both Authorities list is as follows:

Now, note that the set for sAuthorities updates the authorities variable
which is a Set<UserAuthority>

And that the set for authorities updates the Set<String> sAuthority with is
what gets persisted to the table.

So  @Column(name = "sauthorities")
private Set<String> sAuthorities = new HashSet<String>();

Also authorities is @Transient annotated.


public Set<String> getsAuthorities() {
return sAuthorities;
}

public void setsAuthorities(Set<String> sAuthorities) {
this.sAuthorities = sAuthorities;
this.authorities = new HashSet<UserAuthority>();
UserAuthority auxAuthor;
for (String a : sAuthorities) {
auxAuthor = new UserAuthority(a);
this.authorities.add(auxAuthor);
}
}

@Override
public Set<UserAuthority> getAuthorities() {
return this.authorities;
}

public void setAuthorities(Set<UserAuthority> authorities) {
this.authorities = authorities;
this.sAuthorities = new HashSet<String>();
for (UserAuthority a : this.authorities) {
this.sAuthorities.add(a.getAuthority());
}
}


However, when I create the mapper I get the following error:

Exception in thread "main" java.lang.IllegalArgumentException: Cannot find
matching getter and setter for field 'sAuthorities'
at
com.datastax.driver.mapping.ReflectionMapper$ReflectionFactory.createColumnMapper(ReflectionMapper.java:375)
at
com.datastax.driver.mapping.AnnotationParser.convert(AnnotationParser.java:148)
at
com.datastax.driver.mapping.AnnotationParser.parseEntity(AnnotationParser.java:100)
at
com.datastax.driver.mapping.MappingManager.getMapper(MappingManager.java:119)
at com.datastax.driver.mapping.MappingManager.mapper(MappingManager.java:76)

Now, note that sAuthorities is properly annotated:

@Column(name = "sauthorities")
private Set<String> sAuthorities = new HashSet<String>();

My mapper code is as follows:

MappingManager manager = new MappingManager(session);
Mapper<UserPrincipal> mapper = manager.mapper(UserPrincipal.class);
mapper.save(principal);

What is going wrong? Do I have to have a special annotation for Set<text>
 because I could not find one looking at the source code nor the manual.
Yes for UDTs you have that. Do I have to put that inside an UDT?

Thanks.

Re: How to map a set field?

Posted by Carlos Scheidecker <na...@gmail.com>.
Forget about it. Solved. One of those stupid mistakes:

It was a case problem, all I had to do was to change the private
Set<String> sAuthorities to private Set<String> sauthorities and then
update the proper setter and getter.

I have tried the caseSensitive=false on the annotation before to no effect,
which is why I sent the email.

Nonetheless, here is the answer to it in case someone got stuck on the
issue.

On Sat, Sep 20, 2014 at 9:28 PM, Carlos Scheidecker <na...@gmail.com>
wrote:

> Hello all,
>
> I have the following table:
>
> CREATE TABLE userprincipal (
>   userid timeuuid,
>   username varchar,
>   hashedpassword blob,
>   authorities set<text>,
>   accountnonexpired boolean,
>   accountnonlocked boolean,
>   credentialsnonexpired boolean,
>   enabled boolean,
>   PRIMARY KEY(username)
> );
>
> Now, I have an UserPrincipalObject to which Authorities ia a HashSet of
> UserAuthority Spring objects. If the system does the setting through that
> object, I update my own set of Strings called sAuthorities.
>
> On the database I save the sAuthorities which is what I map. But on the
> object on the memory I mape the set of UserAuthorities
>
> My UserPrincipalObject is as follows:
>
> @Table(name = "userprincipal")
> public class UserPrincipal implements UserDetails, CredentialsContainer,
> Cloneable {
>
> @Transient
> private static final long serialVersionUID = 1L;
>
> @PartitionKey
> @Column(name = "username")
> private String userName;
>
> @Column(name = "userid")
> private UUID userID;
>
> @Column(name = "hashedpassword")
> private ByteBuffer hashedPassword;
>
> @Column(name = "sauthorities")
> private Set<String> sAuthorities = new HashSet<String>();
>  @Transient
> @FrozenValue
> Set<UserAuthority> authorities = new HashSet<UserAuthority>();
>
> @Column(name = "accountnonexpired")
> private boolean accountNonExpired;
>
> @Column(name = "accountnonlocked")
> private boolean accountNonLocked;
>
> @Column(name = "credentialsnonexpired")
> private boolean credentialsNonExpired;
>
> @Column(name = "enabled")
> private boolean enabled;
>
> The setters for both Authorities list is as follows:
>
> Now, note that the set for sAuthorities updates the authorities variable
> which is a Set<UserAuthority>
>
> And that the set for authorities updates the Set<String> sAuthority with
> is what gets persisted to the table.
>
> So  @Column(name = "sauthorities")
> private Set<String> sAuthorities = new HashSet<String>();
>
> Also authorities is @Transient annotated.
>
>
> public Set<String> getsAuthorities() {
> return sAuthorities;
> }
>
> public void setsAuthorities(Set<String> sAuthorities) {
> this.sAuthorities = sAuthorities;
> this.authorities = new HashSet<UserAuthority>();
> UserAuthority auxAuthor;
> for (String a : sAuthorities) {
> auxAuthor = new UserAuthority(a);
> this.authorities.add(auxAuthor);
> }
> }
>
> @Override
> public Set<UserAuthority> getAuthorities() {
> return this.authorities;
> }
>
> public void setAuthorities(Set<UserAuthority> authorities) {
> this.authorities = authorities;
> this.sAuthorities = new HashSet<String>();
> for (UserAuthority a : this.authorities) {
> this.sAuthorities.add(a.getAuthority());
> }
> }
>
>
> However, when I create the mapper I get the following error:
>
> Exception in thread "main" java.lang.IllegalArgumentException: Cannot find
> matching getter and setter for field 'sAuthorities'
> at
> com.datastax.driver.mapping.ReflectionMapper$ReflectionFactory.createColumnMapper(ReflectionMapper.java:375)
> at
> com.datastax.driver.mapping.AnnotationParser.convert(AnnotationParser.java:148)
> at
> com.datastax.driver.mapping.AnnotationParser.parseEntity(AnnotationParser.java:100)
> at
> com.datastax.driver.mapping.MappingManager.getMapper(MappingManager.java:119)
> at
> com.datastax.driver.mapping.MappingManager.mapper(MappingManager.java:76)
>
> Now, note that sAuthorities is properly annotated:
>
> @Column(name = "sauthorities")
> private Set<String> sAuthorities = new HashSet<String>();
>
> My mapper code is as follows:
>
> MappingManager manager = new MappingManager(session);
> Mapper<UserPrincipal> mapper = manager.mapper(UserPrincipal.class);
> mapper.save(principal);
>
> What is going wrong? Do I have to have a special annotation for Set<text>
>  because I could not find one looking at the source code nor the manual.
> Yes for UDTs you have that. Do I have to put that inside an UDT?
>
> Thanks.
>