java.lang.IllegalArgumentException:期望IdClass映射 [英] java.lang.IllegalArgumentException: expecting IdClass mapping
问题描述
我已经为我的实体Employee
配置了组合主键,如下所示:
I have configured composite primary key for my entity Employee
as follows
Employee.java:
Employee.java:
@Entity
@Table(name="employee")
@Proxy(lazy=false)
@IdClass(EmployeeId.class)
public class Employee implements Serializable {
private static final long serialVersionUID = 1L;
private EmployeeId employeeId;
private Person person;
private Branch branch;
private boolean isActive;
public Employee() {
}
@EmbeddedId
@AttributeOverrides({
@AttributeOverride(name="person", column = @Column(name="person_id")),
@AttributeOverride(name="branch", column = @Column(name="branch_id"))})
public EmployeeId getEmployeeId() {
return employeeId;
}
public void setEmployeeId(EmployeeId employeeId) {
this.employeeId = employeeId;
}
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="person_id")
public Person getPerson() {
return person;
}
public void setPerson(Person person) {
this.person = person;
}
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="branch_id")
public Branch getBranch() {
return branch;
}
public void setBranch(Branch branch) {
this.branch = branch;
}
@Column(name="is_active")
public boolean getIsActive() {
return isActive;
}
public void setIsActive(boolean isActive) {
this.isActive = isActive;
}
}
EmployeeId.java:
EmployeeId.java:
@Embeddable
public class EmployeeId implements Serializable {
private static final long serialVersionUID = 1L;
private Person person;
private Branch branch;
public EmployeeId() {
}
public EmployeeId(Person argPerson, Branch argbranch) {
this.person = argPerson;
this.branch = argbranch;
}
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="person_id", insertable=false, updatable=false)
public Person getPerson() {
return person;
}
public void setPerson(Person person) {
this.person = person;
}
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="branch_id", insertable=false, updatable=false)
public Branch getBranch() {
return branch;
}
public void setBranch(Branch branch) {
this.branch = branch;
}
}
我使用类org.springframework.orm.hibernate5.LocalSessionFactoryBean
创建了SessionFactory
bean,并将所有hbm.xml
映射为MappingLocations
.
I created a SessionFactory
bean using class org.springframework.orm.hibernate5.LocalSessionFactoryBean
and mapped all hbm.xml
as a MappingLocations
.
我的代码抛出以下错误:
My code throws the following error:
Caused by: java.lang.IllegalArgumentException: expecting IdClass mapping
at org.hibernate.metamodel.internal.AttributeFactory$3.resolveMember(AttributeFactory.java:971)
at org.hibernate.metamodel.internal.AttributeFactory$5.resolveMember(AttributeFactory.java:1029)
at org.hibernate.metamodel.internal.AttributeFactory.determineAttributeMetadata(AttributeFactory.java:451)
at org.hibernate.metamodel.internal.AttributeFactory.buildIdAttribute(AttributeFactory.java:128)
at org.hibernate.metamodel.internal.MetadataContext.buildIdClassAttributes(MetadataContext.java:337)
at org.hibernate.metamodel.internal.MetadataContext.applyIdMetadata(MetadataContext.java:269)
at org.hibernate.metamodel.internal.MetadataContext.wrapUp(MetadataContext.java:190)
at org.hibernate.metamodel.internal.MetamodelImpl.initialize(MetamodelImpl.java:219)
at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:296)
at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:476)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:707)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:723)
at org.springframework.orm.hibernate5.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:504)
at org.springframework.orm.hibernate5.LocalSessionFactoryBean.afterPropertiesSet(LocalSessionFactoryBean.java:488)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFac
如何避免此错误?我正在使用spring-orm-4.3.1-RELEASE
和hibernate-core-5.2.0.Final
.
How can I avoid this error? I am using spring-orm-4.3.1-RELEASE
and hibernate-core-5.2.0.Final
.
更新
我创建了一个示例项目,运行时遇到以下错误...
I have created a sample project and I am getting the following error while running...
Caused by: org.hibernate.AnnotationException: Property of @IdClass not found in entity sample.domain.Employee: employee
请参考代码: https://www.dropbox.com/s/axr8l01iqh0qr29/idclass-using-hibernate5.tar.gz?dl=0
我做错了什么?请在这里提供您的输入内容
What I did wrong? Kindly provide your inputs here
推荐答案
您的情况对应于
Your situation corresponds to the chapter 2.4.1 Primary Keys Corresponding to Derived Identities of the JPA 2.1 Specification.
Employee
的标识是从Person
和Branch
的标识派生的.您没有显示任何一个的代码,因此我假设它们具有简单的主键.在该关系中,Person
和Branch
是父实体".并且Employee
是依赖的".实体.
The identity of Employee
is derived from identities of Person
and Branch
. You haven't shown the code of either of them, so I'll assume they have simple primary keys. In that relationship, Person
and Branch
are "parent entities" and Employee
is a "dependant" entity.
Employee
的ID可以使用IdClass
或EmbeddedId
映射,而不是同时映射.
The ID of Employee
may be mapped using either IdClass
or EmbeddedId
, not both at the same time.
请参见 2.4.1.1派生身份规范一章.
如果要使用IdClass
,则:
id类的属性名称和从属实体类的Id属性名称必须对应如下:
The names of the attributes of the id class and the Id attributes of the dependent entity class must correspond as follows:
- 实体类中的
Id
属性和id类中的对应属性必须具有相同的名称.
- The
Id
attribute in the entity class and the corresponding attribute in the id class must have the same name.
...
- 如果实体中的
Id
属性是与父实体的多对一或一对一关系,则id类中的对应属性必须是(...)父实体的Id
属性.
- If an
Id
attribute in the entity is a many-to-one or one-to-one relationship to a parent entity, the corresponding attribute in the id class must be of (...) the type of theId
attribute of the parent entity.
所以您的类看起来像这样(省略了getters,setters,多余的注释等)
So your classes would look like this (getters, setters, superfluous annotations etc. omitted)
@Entity
@IdClass(EmployeeId.class)
public class Employee {
@Id
@ManyToOne
private Person person;
@Id
@ManyToOne
private Branch branch;
}
public class EmployeeId {
private Long person; // Corresponds to the type of Person ID, name matches the name of Employee.person
private Long branch; // Corresponds to the type of Branch ID, name matches the name of Employee.branch
}
如果使用EmbeddedId
,则:
如果从属实体使用嵌入的ID表示其主键,则嵌入的ID中与Relationship属性相对应的属性必须与父实体的主键具有相同的类型,并且必须由
应用于关系属性的注释. MapsId
批注的value
元素必须用于在关系属性所对应的嵌入式ID中指定属性的名称.
If the dependent entity uses an embedded id to represent its primary key, the attribute in the embedded id corresponding to the relationship attribute must be of the same type as the primary key of the parent entity and must be designated by the
MapsId
annotation applied to the relationship attribute. Thevalue
element of theMapsId
annotation must be used to specify the name of the attribute within the embedded id to which the relationship attribute corresponds.
代码如下:
@Entity
public class Employee {
@EmbeddedId
private EmployeeId id;
@ManyToOne
@MapsId("personId") // Corresponds to the name of EmployeeId.personId
private Person person;
@ManyToOne
@MapsId("branchId") // Corresponds to the name of EmployeeId.branchId
private Branch branch;
}
@Embeddable
public class EmployeeId {
private Long personId; // Corresponds to the type of Person ID
private Long branchId; // Corresponds to the type of Branch ID
}
这篇关于java.lang.IllegalArgumentException:期望IdClass映射的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!