Java 带有@IdClass且无属性的JPA子类
我有一个子类实体,没有@Id或@Column属性 但是我的子类实体有@IdClass,如下所示Java 带有@IdClass且无属性的JPA子类,java,hibernate,jpa,jboss7.x,Java,Hibernate,Jpa,Jboss7.x,我有一个子类实体,没有@Id或@Column属性 但是我的子类实体有@IdClass,如下所示 @Entity @Table(name = "Employee") @IdClass(EmployeeEntityPK.class) public class EmployeeEntity extends AbstractEntity { @Override public void setName(String name) { super.setName(na
@Entity
@Table(name = "Employee")
@IdClass(EmployeeEntityPK.class)
public class EmployeeEntity extends AbstractEntity {
@Override
public void setName(String name) {
super.setName(name);
}
@Override
public void setLocation(String location) {
super.setLocation(location);
}
@Override
public void setEmpId(Integer empId) {
super.setEmpId(empId);
}
}
@MappedSuperclass
public class AbstractEntity implements Serializable {
@Id
@Column(name = "empId")
private Integer empId;
@Column(name = "Name")
private String name;
@Column(name = "LOCATION")
private String location;
public Integer getEmpId() {
return empId;
}
//along with other getter setters
}
当我尝试部署我的项目时。我从hibernate得到异常
Caused by: java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
at java.util.ArrayList.RangeCheck(ArrayList.java:547) [rt.jar:1.6.0_17]
at java.util.ArrayList.get(ArrayList.java:322) [rt.jar:1.6.0_17]
at org.hibernate.cfg.AnnotationBinder.getUniqueIdPropertyFromBaseClass(AnnotationBinder.java:2576)
at org.hibernate.cfg.AnnotationBinder.isIdClassPkOfTheAssociatedEntity(AnnotationBinder.java:925)
at org.hibernate.cfg.AnnotationBinder.mapAsIdClass(AnnotationBinder.java:824)
at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:671)
完全异常在
Hibernate正在尝试从我的实体中查找@Id类,但实体不在那里
我如何解决这个问题
我的超级班如下
@Entity
@Table(name = "Employee")
@IdClass(EmployeeEntityPK.class)
public class EmployeeEntity extends AbstractEntity {
@Override
public void setName(String name) {
super.setName(name);
}
@Override
public void setLocation(String location) {
super.setLocation(location);
}
@Override
public void setEmpId(Integer empId) {
super.setEmpId(empId);
}
}
@MappedSuperclass
public class AbstractEntity implements Serializable {
@Id
@Column(name = "empId")
private Integer empId;
@Column(name = "Name")
private String name;
@Column(name = "LOCATION")
private String location;
public Integer getEmpId() {
return empId;
}
//along with other getter setters
}
如果我有一个包含多个列的主键,我会在我想用作主键的类上使用普通的@Id属性。Id类用@Embeddeble注释 例如: 实体:
@Entity
public class Foo extends AbstractEntity implements Serializable {
private static final long serialVersionUID = 1;
@EmbeddedId
private FooPK id;
//Getter, Setter...
}
嵌入式ID:
@Embeddable
public class FooPK implements Serializable {
private static final long serialVersionUID = 1;
private Integer firstId;
private Integer SecondId;
public FavoritenPK() {
}
// Setter, Getter...
}
编辑:
我在MappedSuperclass中使用@Id时遇到问题。尽量不要将@Id属性放在映射的超类中 你的超类看起来怎么样?据我所知,层次结构中的所有类都应该共享相同的ID属性。我的超类AbstractEntity用@MappedSuperclass和ID列(name=“empId”)标记,其他列属性用getter和setter标记。。用super classI修改了问题我不确定你想做什么。Employee显然将从超类继承ID,并定义不同类型的IdClass。我看不出这将如何运作。也许你需要介绍另一门课?AbstractEntity(名称、位置)->AbstractEntityWithIdentifier->(ID、版本)。EmployeeEntity扩展了前者,而不是后者。