Я пытаюсь выяснить, возможно ли заставить JPA сохранять абстрактную коллекцию с конкретными реализациями.
Пока что мой код выглядит так:
@Entity
public class Report extends Model {
@OneToMany(mappedBy = "report",fetch=FetchType.EAGER)
public Set<Item> items;
}
@MappedSuperclass
public abstract class OpsItem extends Model {
@ManyToOne
public RetailOpsBranch report;
}
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class AItem extends OpsItem {
...
}
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class BItem extends OpsItem {
...
}
Но я постоянно натыкаюсь на ошибку отображения ниже и не знаю, возможно ли это?
JPA error
A JPA error occurred (Unable to build EntityManagerFactory): Use of @OneToMany or
@ManyToMany targeting an unmapped class: models.Report.items[models.OpsItem]
ОБНОВЛЕНИЕ
Я не думаю, что проблема связана с абстрактным классом, а с аннотацией @MappedSuperClass. Похоже, что jpa не любит отображать отношения «один ко многим» с помощью @MappedSuperClass. Если я изменю абстрактный класс на конкретный класс, у меня будет та же ошибка.
Если я затем перейду на аннотацию @Entity, это, похоже, будет работать как с абстрактным, так и с конкретным классом.
Немного странно сопоставлять абстрактный класс с @Entity.Я что-то пропустил?
РЕШЕНИЕ
С помощью rhind удалось разобраться. Два момента, на которые следует обратить внимание:
1) абстрактный класс должен быть аннотирован с помощью @Entity и стратегии наследования таблиц для каждого класса, чтобы подклассы имели свои собственные таблицы.
2) Генерация Identity Id не будет работать в этом сценарии, и мне пришлось использовать тип генерации Таблицы.
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class OpsItem extends GenericModel {
@Id
@GeneratedValue(strategy = GenerationType.TABLE)
public Long id;
public String branchCode;
@ManyToOne
public Report report;
}
@Entity
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public class AItem extends OpsItem {
...
}