Rahul Shivsharan
Rahul Shivsharan

Reputation: 2561

Using @IdClass for storing entity with composite primary key, but fails to persist

my id class as follows,

public class EmployeeId implements Serializable{
    public EmployeeId(){}
    public EmployeeId(Integer id, String country){
        this.id = id;
        this.country = country;
    }

    private Integer id;
    private String country;

    @Override
    public int hashCode(){        
        return this.getCountry().hashCode() + getId();
    }

    @Override
    public boolean equals(Object o){
        boolean flag = false;
        EmployeeId myId = (EmployeeId) o;

        if((o instanceof EmployeeId) 
                && (this.getCountry().equals(myId.getCountry()))
                && (this.id == myId.getId())){
            flag = true;
        }
        return flag;
    }
// rest of the code with getters only
}

Following is my entity using

@Entity
@IdClass(EmployeeId.class)
@Table(name="TBL_EMPLOYEE_FOUR")
public class EmployeeEntityTwo {

    public EmployeeEntityTwo(){}
    public EmployeeEntityTwo(Integer id,String country, String empName){
        this.country = country;
        this.employeeId = id;
        this.empName = empName;
    }

    @Id
    @Column(name="ID")
    private Integer employeeId;

    @Id
    @Column(name="COUNTRY",length=50)
    private String country;

    @Column(name="NAME",length=50)
    private String empName;
// getters and setters
}

This is my table

create table TBL_EMPLOYEE_FOUR(
    ID integer, 
    COUNTRY varchar(50),
    NAME varchar(50),
    constraint PK_EMP_00239 primary key(ID,COUNTRY)
)

This is what i am trying to run

 private static void idClassStore(EntityManager em) throws Exception{
     List<EmployeeEntityTwo> employees = Arrays.asList(new EmployeeEntityTwo(12, "KENYA", "Ridushi Ogambe"),
                                                       new EmployeeEntityTwo(13, "GHANA", "Mikila Hanza"),
                                                       new EmployeeEntityTwo(14, "EGYPT", "Abdul Hameed Fagdaul"),
                                                       new EmployeeEntityTwo(15, "MOROCCO", "Jamil Mahmoud"),
                                                       new EmployeeEntityTwo(16, "LIBERIA", "Robert Damus"));

     for(EmployeeEntityTwo employee : employees){
         em.persist(employee);            
       }
}

But i get an exception as

Caused by: org.hibernate.AnnotationException: Property of @IdClass not found in entity com.entities.EmployeeEntityTwo: id

I am using JPA with Hibernate as persistence provider,

But @IdClass which i have used is of import javax.persistence.IdClass;

so where is am going wrong,

Upvotes: 10

Views: 21738

Answers (1)

Rahul Shivsharan
Rahul Shivsharan

Reputation: 2561

I have discovered the solution:

The 'id' field in the classes EmployeeEntityTwo and EmployeeId should be same.

// EmployeeId.java;
private Integer id;

should be

// EmployeeId.java;
private Integer employeeId;

I adjusted the getter respectively, and it worked.


From javax.persistence.IdClass JavaDocs:

The names of the fields or properties in the primary key class and the primary key fields or properties of the entity must correspond and their types must be the same.

Upvotes: 16

Related Questions