Java 冬眠。通用复合PK问题
我对Hibernate中的复合主键有问题 例如:Java 冬眠。通用复合PK问题,java,spring,hibernate,generics,primary-key,Java,Spring,Hibernate,Generics,Primary Key,我对Hibernate中的复合主键有问题 例如: @Entity @Table(name = "T_PASSPORTS") public class Passport implements Serializable { @Id private String id; //Or int, long... public Passport() {} // Getters/setters are below. 我有一个类,它表示该类的所有实例的基本主键 public
@Entity
@Table(name = "T_PASSPORTS")
public class Passport implements Serializable {
@Id
private String id; //Or int, long...
public Passport() {}
// Getters/setters are below.
我有一个类,它表示该类的所有实例的基本主键
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、String等等
在这种情况下,我希望有一个像这样的通用主键:
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;
}
}
公共类SimplePK扩展PrimaryKey{
/**
*表示实体的简单键字段(即int、long、String等);
*/
私人T-id;
公共SimplePK(){}
公共SimplePK(T id){
this.id=id;
}
公共T getId(){
返回此.id;
}
公共无效设置id(T id){
this.id=id;
}
}
问题:如何以注释映射的方式解决它
p、 当我试图像上一个例子那样解决它时(通过@IdClass(SimplePK.class),我发现一个“org.springframework.beans.factory.BeanCreationException:创建名为“sessionFactory”的bean时出错,该bean在类路径资源[application context.xml]中定义:调用init方法失败;嵌套异常为org.hibernate.AnnotationException:Property com.testprj.entity.SimplePK.id具有未绑定类型且没有显式目标实体。请解决此通用用法问题或设置显式目标属性(例如@OneToMany(target=)或使用显式@type“
异常
p、 另外,我使用Hibernate和Spring框架来连接组件
如果有任何帮助,我将不胜感激。我认为您不能在id类中使用泛型类型。 使用@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.
}我找到了解决方案:现在我使用
@embeddeble
类来表示我的“泛型”主键(继承主键基类),并在实体中指定其类型。将抽象的“PrimaryKey”类保存为所有主键实例的基类非常重要。