JPA继承要求子类中的ID

los*_*and 27 inheritance jpa eclipselink

我的jpa域模型有问题.我只是尝试使用简单的继承,我使用一个简单的Person基类和Customer子类.根据官方文档(JPA和EclipseLink),我只需要基类中的ID-attribute/column.但是当我运行我的测试时,我总是得到一个错误,告诉我客户没有@Id?

首先,我认为问题在于id属性的可见性,因为它首先是私有的.但即使我将其更改为protected(因此子类具有直接访问权限),它也无法正常工作.

人:

@Entity @Table(name="Persons")
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name = "TYPE")
public class Person {

    @Id
    @GeneratedValue
    protected int id;
    @Column(nullable = false)
    protected String firstName;
    @Column(nullable = false)
    protected String lastName;
Run Code Online (Sandbox Code Playgroud)

顾客:

@Entity @Table(name = "Customers")
@DiscriminatorValue("C")
public class Customer extends Person {

    //no id needed here
Run Code Online (Sandbox Code Playgroud)

我的想法和资源都用完了.这应该是一个相当简单的问题,但我只是没有看到它.

los*_*and 36

我通过创建MappedSuperclass自己解决了这个问题

@MappedSuperclass
public abstract class EntityBase{
   @Id
   @GeneratedValue
   private int id;

   ...setter/getter
}
Run Code Online (Sandbox Code Playgroud)

所有实体都继承自此类.我仍然想知道为什么教程不提这个,但也许它在JPA 2实现中变得更好.

  • +1.我相信这是您具体问题的正确答案. (2认同)
  • 到目前为止,oracle-doc 确实提到了“MappedSuperclass”注释:https://docs.oracle.com/javaee/7/tutorial/doc/persistence-intro002.htm 。这绝对是正确的方法:) (2认同)

小智 9

我有完全相同的问题.对于子类我得到:

Entity class [...] has no primary key specified. It should define either an @Id, @EmbeddedId or an @IdClass.

在我的情况下,事实证明我忘了添加我的根类persistence.xml.

确保在以下位置定义了Person和Customer:

<persistence>
  <persistence-unit>
    ...
    <class>package.Person</class>
    <class>package.Customer</class>
    ...
  </persistence-unit>
</persistence>
Run Code Online (Sandbox Code Playgroud)