冬眠.通用复合 PK 问题



我在休眠中遇到复合主键的问题。

例:

我有一个类,它表示所有实例的基本主键。

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.

}

最新更新