Java 如何为继承的JPA类的ID使用不同的列名

Java 如何为继承的JPA类的ID使用不同的列名,java,jpa,inheritance,Java,Jpa,Inheritance,与和类似,但情况更简单。我只想更改类的名称 CREATE TABLE`billing\u target`( `billingTargetID`int(11)不为空, `targetType`char(5)不为空, `targetID`int(11)不为空 主键(`billingTargetID`) ); 创建表“Client”( `clientID`int(11)不为空, `名称`瓦查尔(200), 主键(`clientID`) ); 这是我迄今为止的尝试 @Data @Entity pub

与和类似,但情况更简单。我只想更改类的名称

CREATE TABLE`billing\u target`(
`billingTargetID`int(11)不为空,
`targetType`char(5)不为空,
`targetID`int(11)不为空
主键(`billingTargetID`)
);
创建表“Client”(
`clientID`int(11)不为空,
`名称`瓦查尔(200),
主键(`clientID`)
);
这是我迄今为止的尝试

@Data
@Entity
public class BillingTarget implements Serializable {
    @Id
    @Column(name = "BillingTargetID")
    private Integer id;
}

@Data
@Entity
@Table(name = "Client")
@DiscriminatorValue("CLIENT")
@EqualsAndHashCode(callSuper = true)
@AttributeOverride(
    name = "id",
    column = @Column(name = "ClientID")
)
public class Client extends BillingTarget {
    private String name;
}
但是,我的查询是查找
Client.billingargetid
而不是
Client.ClientID

由于I
@AttributeOverride
它被忽略

@不支持AttributeOverride或@AttributeOverrides与实体继承结合使用:

如果我将
BillingTarget
a
@MappedSuperclass
设置为

原因:java.lang.NullPointerException 位于org.hibernate.boot.internal.InFlightMetadataCollectorImpl.ProcessFKSSecondPasseNorder(InFlightMetadataCollectorImpl.java:1745)


这是一个典型的例子,说明了为什么我在所有情况下都坚持将主键列命名为
id
。有充分的理由这样做,但没有充分的理由不这样做。如果需要将其呈现为“clientId”,这是UI层的一个问题,应该会影响正确的数据库设计和遵守标准。只是想把JPA映射到上面。事实上比我在那里写的更糟。看,实际情况是一个targetID,但我发现BillingTargetID和targetID总是相等的。