我在休眠中遇到复合主键的问题。
例:
我有一个类,它表示所有实例的基本主键。
public abstract class PrimaryKey implements Serializable { /* ... */ }
它只实现了java.io.Serializable接口,并且可以在泛型或其他类的方法中用作参数来缩小接受的类。
另一个主键类应继承它,并将特定字段添加为键。例如:
public class PassportPK extends PrimaryKey {
private String number;
private String series;
public PassportPK() {}
public PassportPK(String number, String series) {
this.number = number;
this.series = series;
}
// Getters/setters are below.
}
然后,它将用于适当的实体中,如下所示:
@Entity
@Table(name = "T_PASSPORTS")
@IdClass(PassportPK.class)
public class Passport implements Serializable {
@Id
@Column(name = "F_NUMBER")
private String number;
@Id
@Column(name = "F_SERIES")
private String series;
public Passport() {}
// Getters/setters are below.
}
如果我与这样的实体达成协议,一切正常。
但是我的项目中的某些实体有一个简单的主键,如 int、long、字符串等。
在这种情况下,我想要一个像这样的通用主键:
public class SimplePK<T extends Serializable> extends PrimaryKey {
/**
* Represents a simple key field of entity (i.e. int, long, String, ...);
*/
private T id;
public SimplePK() {}
public SimplePK(T id) {
this.id = id;
}
public T getId() {
return this.id;
}
public void setId(T id) {
this.id = id;
}
}
问题:如何以注释映射方式解决它?
附言当我尝试像上一个示例一样解决它时(通过 @IdClass(SimplePK.class),我发现了一个"org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in class path resource [application-context.xml]: Invocation of init method failed; nested exception is org.hibernate.AnnotationException: Property com.testprj.entity.SimplePK.id has an unbound type and no explicit target entity. Resolve this Generic usage issue or set an explicit target attribute (eg @OneToMany(target=) or use an explicit @Type"
异常。
附言我使用带有Spring框架的Hibernate来连接组件。
我将不胜感激任何帮助!
我认为您不能在id Class中使用泛型类型。使用@IdClass指示复合主键的类,如果只想使用一个属性(如主键),则必须在声明上使用@Id并删除@IdClass。
例:
@Entity
@Table(name = "T_PASSPORTS")
public class Passport implements Serializable {
@Id
private String id; //Or int, long...
public Passport() {}
// Getters/setters are below.
}