java 使用@IdClass 存储具有复合主键的实体,但无法持久化

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/15640897/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-31 20:22:16  来源:igfitidea点击:

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

javajpajpa-2.0

提问by Rahul Shivsharan

my id class as follows,

我的id类如下,

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,

我使用 JPA 和 Hibernate 作为持久性提供者,

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

但是我使用的@IdClass 是 import javax.persistence.IdClass;

so where is am going wrong,

所以我哪里出错了,

回答by Rahul Shivsharan

I have discovered the solution:

我发现了解决方案:

The 'id' field in the classes EmployeeEntityTwoand EmployeeIdshould be same.

在类中的“ID”字段EmployeeEntityTwo,并EmployeeId应该是相同的。

// EmployeeId.java;
private Integer id;

should be

应该

// EmployeeId.java;
private Integer employeeId;

I adjusted the getter respectively, and it worked.

我分别调整了吸气剂,它起作用了。



From javax.persistence.IdClassJavaDocs:

来自javax.persistence.IdClassJavaDocs:

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.

主键类中的字段或属性的名称与实体的主键字段或属性的名称必须对应,并且它们的类型必须相同。