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
Using @IdClass for storing entity with composite primary key, but fails to persist
提问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 EmployeeEntityTwo
and EmployeeId
should 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.IdClass
JavaDocs:
来自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.
主键类中的字段或属性的名称与实体的主键字段或属性的名称必须对应,并且它们的类型必须相同。