Hibernate 如何使用spring jpa创建复合键,其中键的一个属性在@MappedSuperClass中,另一个属性在@Entity类中?

Hibernate 如何使用spring jpa创建复合键,其中键的一个属性在@MappedSuperClass中,另一个属性在@Entity类中?,hibernate,inheritance,spring-data-jpa,composite-key,mappedsuperclass,Hibernate,Inheritance,Spring Data Jpa,Composite Key,Mappedsuperclass,我需要创建一个复合密钥。键的一个属性位于MappedSuperClass中,我无法修改它。键的另一个属性位于作为实体类的派生类中。但是,我在执行下面的命令时遇到了一个运行时错误,该错误表示基类的属性(也存在于@IdClass中)不是实体类(派生类)的属性。请指导我如何处理这种情况 @MappedSuperClass public abstract class Base { @Id protected String id; } @Entity @Idclass(DerivedPK

我需要创建一个复合密钥。键的一个属性位于MappedSuperClass中,我无法修改它。键的另一个属性位于作为实体类的派生类中。但是,我在执行下面的命令时遇到了一个运行时错误,该错误表示基类的属性(也存在于@IdClass中)不是实体类(派生类)的属性。请指导我如何处理这种情况

@MappedSuperClass
public abstract class Base
{
    @Id
    protected String id;
}

@Entity
@Idclass(DerivedPK.class)
public Derived extends Base
{
    @Id
    protected float version;
}

public class DerivedPK
{
    private String id;
    private float version;
}

我得到一个错误,表示在类“派生”中找不到DerivedPK中存在的属性“id”。使用的Hibernate版本是4.1.1.Final。

这可以使用下面提到的示例代码实现

不要忘记使用逻辑名称(baseProp、childProp) 而不是物理(基本道具,子道具)一次

@Data和@EqualsAndHashCode(callSuper=true)这些是lombok提供的注释,它们减少了为所有实体属性编写getter和setter的开销

例如:

@Data
@MappedSuperclass
public class BaseEntity {

  protected Long baseProp;

}

@Data
@Entity
@EqualsAndHashCode(callSuper = true)
@Table(uniqueConstraints = {
    @UniqueConstraint(columnNames = {"baseProp", "childProp"})
})
public class ChildEntity extends BaseEntity {

@Id
private Long id;

private String childProp;

}

我的第一个想法是,使用Float作为PK不是个好主意。错误可能是这样的。此类(派生)的祖先已定义主键。此处可能未定义ID类。