繁体   English   中英

冬眠。 通用复合PK问题

[英]Hibernate. Generic Composite PK issue

我在Hibernate中使用复合主键时遇到问题。

例:

我有一个代表该类所有实例的基本主键的类。

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;
    }
}

问题:如何以注释映射方式解决它?

ps当我尝试像上一个示例中一样解决它时(通过@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"异常。

pps我使用带有Spring框架的Hibernate来连接组件。

我将不胜感激!

我认为您不能在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.

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM