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 {
}