JPA: сущность расширяется вместе с сущностью

Как я могу расширить сущность другой сущностью, но обе они ссылаются на одну и ту же таблицу? Является ли это возможным? Структура примерно такая:

@Entity
@Table(name = "users")
@NamedQuery(name="User.findAll", query="SELECT u FROM User u")
public class User implements Serializable{
    private int id;
    private String name;
}

@Entity
@Table(name = "users")
@NamedQuery(name="SubUser.findAll", query="SELECT su FROM SubUser su")
public class SubUser extends User {

    @Override
    @Id  
    @GeneratedValue(strategy=GenerationType.AUTO)
    public int getId() {
      return super.getId();
    }

    //- Other fields and getter setter

}

Я пытался таким образом расширить сущность JPA, чтобы добавить атрибуты и логику

но я получил это исключение

org.hibernate.mapping.SingleTableSubclass cannot be cast to org.hibernate.mapping.RootClass

Обновление 1

Я уже положил @Id для SubUser, потому что @Entity показывает это исключение

The entity has no primary key attribute defined

2 ответа

  • Добавьте аннотацию @Inheritance в суперкласс
  • Реализовать Сериализуемый
  • Добавить геттер для id (вам не нужен сеттер обязательно)
  • id должно быть Integer, а не int, чтобы вы могли представлять неназначенные идентификаторы с нулем.

Код:

@Entity
@Table(name = "users")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public class User implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id  
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Integer id;

    private String name;

    public Integer getId() {
      return id;
    }

    public String getName() {
      return name;
    }

    public void setName(String name) {
      this.name = name;
    }
}


@Entity
public class SubUser extends User {

}

Любые базовые документы JPA описывают наследование, дискриминаторы и использование @Id,

@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="DISCRIM", discriminatorType=DiscriminatorType.STRING)
@DiscriminatorValue("User")
@Table(name="users")
@NamedQuery(name="User.findAll", query="SELECT u FROM User u")
public class User implements Serializable{
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private int id;

    private String name;
}

@Entity
@DiscriminatorValue("SubUser")
@NamedQuery(name="SubUser.findAll", query="SELECT su FROM SubUser su")
public class SubUser extends User {

}
Другие вопросы по тегам