Как отобразить абстрактную коллекцию с помощью jpa?

Я пытаюсь выяснить, возможно ли заставить 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 {
...
}
9
задан emt14 26 March 2012 в 07:07
поделиться