3

我需要创建一个复合键。键的一个属性位于我无法修改的 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;
}

我收到一条错误消息,提示在“Derived”类中找不到 DerivedPK 中存在的属性“id”。使用的休眠版本是 4.1.1.Final。

4

1 回答 1

1

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

不要忘记使用一次逻辑名称(baseProp,childProp)而不是物理名称(base_prop,child_prop)。

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

}
于 2019-03-15T13:40:22.140 回答