2

晚上好。我试图使用JPA/Hibernate将类层次结构映射到单个表,并在我的子类上收到错误,指出“实体没有定义主键属性”。这些类定义如下:Hibernate Single_Table持久化实体没有在子类上定义的主键属性

@Entity 
@Table(name = "payments") 
@Inheritance (strategy=InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(name="creditDebitFlag",discriminatorType=DiscriminatorType.STRING) 
@Veto 
public abstract class Payment implements IPayment, Serializable{ 

private static final long serialVersionUID = 8354755060201271169L; 
public Integer id; 
    ... 

@Override 
@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
@Column(name="id") 
public void setId(Integer id) { 
    this.id = id; 
} 

@Override 
public Integer getId() { 
    return this.id; 
} 
} 
@Entity 
@DiscriminatorValue("C") 
@Veto 
public class CreditPayment extends Payment implements Serializable { 


    private static final long serialVersionUID = 1L; 

public CreditPayment() { 
    super(); 
} 
} 

我在做什么错?我已阅读了Hibernate docs,并花费了相当多的时间来浏览谷歌,看不到我错过了什么。

在此先感谢您的帮助!

回答

3

你的问题与继承无关。这个错误来了,因为你在setter中有持久性映射注释。这些注释应该在字段或getter中。在这种情况下,只需将注释从setId移动到getId(并且如果您有其他setter的注释,则也可以移动它们)。

JPA规范:

当使用基于属性的访问,对象/关系映射 注解实体类注释吸气属性 存取[7] ....
[7]这些注释不能应用于setter方法。

+0

就是这样!我可以发誓我已经在吸气剂上设置了注释,但是我只是将它们移开,问题就消失了。谢谢! – user599144

相关问题