Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

error: annotation type not applicable to this kind of declaration

I'm trying to compile a Java web app that I'm writing, and I"m getting compile errors that I'm not sure what to do with. From the googling I've done, I found this SO question, but the asker is using EJB, while my error is in a JPA entity class.

Here's the maven build error.

[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3.988s
[INFO] Finished at: Mon Jun 24 02:39:51 UTC 2013
[INFO] Final Memory: 15M/247M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.3.2:compile (default-compile) on project donebox: Compilation failure: Compilation failure:
[ERROR] /home/cl-server/builder/tomcat-ide-builder/temp/build-1236514164814552082/src/main/java/net/donebox/accounts/User.java:[50,4] error: annotation type not applicable to this kind of declaration
[ERROR] /home/cl-server/builder/tomcat-ide-builder/temp/build-1236514164814552082/src/main/java/net/donebox/accounts/User.java:[60,4] error: annotation type not applicable to this kind of declaration
[ERROR] /home/cl-server/builder/tomcat-ide-builder/temp/build-1236514164814552082/src/main/java/net/donebox/accounts/Role.java:[53,4] error: annotation type not applicable to this kind of declaration
[ERROR] -> [Help 1]
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException

And here's my User class file.

package net.donebox.accounts;
import java.io.Serializable;
import java.util.UUID;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.Basic;
import javax.persistence.Cacheable;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.GeneratedValue;
import javax.persistence.Table;
import javax.persistence.Column;
import javax.persistence.Index;
import javax.persistence.ManyToMany;
import javax.persistence.JoinTable;

import org.apache.shiro.crypto.hash.Sha256Hash;
import org.apache.shiro.crypto.RandomNumberGenerator;
import org.apache.shiro.crypto.SecureRandomNumberGenerator;

@Entity
@Table(name="users")
public class User {

    private UUID id;
    private String username;
    private String email;
    private String password;
    private Set<Role> roles = new HashSet<Role>();


    @Id
    @GeneratedValue
    public UUID getId() {
        return id;
    }

    public void setId() {
        this.id = UUID.randomUUID();
    }

    /**
     * Returns the username associated with this user account;
     *
     * @return the username associated with this user account;
     */
    @Basic
    @Column(length=100)
    @Index(name="idx_users_username", columnList="username") //Error here.
    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    @Basic
    @Index(name="idx_users_email", columnList="email") // And here.
    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    /**
     * Returns the password for this user.
     *
     * @return this user's password
     */
    @Basic(optional=false)
    @Column(length=255)
    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }


    @ManyToMany
    @JoinTable(name="users_roles")
    public Set<Role> getRoles() {
        return roles;
    }

    public void setRoles(Set<Role> roles) {
        this.roles = roles;
    }

}

I looked at the javax.persistence.Index JavaDoc, and I have the declaration correct, so I'm stumped here, Does someone know what I'm doing wrong? Thank you for your time and consideration.

like image 729
Levi Campbell Avatar asked Jun 24 '13 03:06

Levi Campbell


1 Answers

From the JavaDoc here: http://docs.oracle.com/javaee/7/api/javax/persistence/Index.html, it seems that Index annotation has @Target(value={}) which means it should be used as a part of complex annotation and can't be used directly.

Quoting from https://blogs.oracle.com/arungupta/entry/jpa_2_1_schema_generation, it seems that it can be used only as part of JPA annotations: "@Index - An index for the primary key is generated by default in a database. This new annotation will allow to define additional indexes, over a single or multiple columns, for a better performance. This is specified as part of @Table, @SecondaryTable, @CollectionTable, @JoinTable, and @TableGenerator"

like image 86
user2507946 Avatar answered Sep 27 '22 19:09

user2507946