Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 冬眠。通用复合PK问题_Java_Spring_Hibernate_Generics_Primary Key - Fatal编程技术网

Java 冬眠。通用复合PK问题

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

我对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 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”类保存为所有主键实例的基类非常重要。