我需要创建一个复合键。键的一个属性在MappedSuperClass中,我无法修改它。键的另一个属性在派生类中,派生类是实体类。然而,我在执行下面的时遇到了一个运行时错误,它表明基类的属性(也存在于@IdClass中)不是Entity类(派生类)的属性。请指导我如何处理这种情况。
@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"。使用的Hibernate版本是4.1.1.Final。
这可以使用下面提到的示例代码来实现。
不要忘记使用逻辑名称(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;
}