2012-02-14 2 views
2

Привет, У меня проблема с медленной JPA. Использование jps для сопоставления модели очередей, моментальных снимков очередей и событий. Вот мои Сущности:JPA вручную создает @JoinTable

@Entity 
@Table(name = "cmEvent") 
public class Event implements Serializable { 
    private static final long serialVersionUID = -3252213465022678048L; 
    @Id 
    @Column(name = "eventId") 
    private long eventId; 

    @ManyToMany(fetch = FetchType.EAGER) 
    @JoinTable(
    name = "cmEventSnap", 
    joinColumns = @JoinColumn(name = "eventId"), 
    inverseJoinColumns = @JoinColumn(name = "snapshotId")) 
    private List<Snapshot> snapshots = new ArrayList<Snapshot>(); 
    // setters & getters 
} 

@Entity 
@Table(name = "cmSnapshot") 
public class Snapshot implements Serializable { 
    private static final long serialVersionUID = -3892306246413539227L; 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "snapshotId") 
    private long snapshotId; 

    @ManyToMany(mappedBy = "snapshots", cascade = CascadeType.ALL, fetch = FetchType.LAZY) 
    private List<Event> events = new ArrayList<Event>(); 
    // setters & getters 
} 

@Entity 
@Table(name = "cmQueue") 
public class Queue implements Serializable { 
    private static final long serialVersionUID = 2209454705341173802L; 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "queueId") 
    private long queueId; 

    @OneToMany(mappedBy = "queue", cascade = CascadeType.ALL) 
    private List<Snapshot> snapshots = new ArrayList<Snapshot>(); 
    // setters & getters 
} 

Так что моя проблема сводится к тому, что JoinTable для событий Entity автоматически создается из JPA становится все довольно большим, и это становится все медленно, как проходит время.

Я, хотя и создаю индексы для этой таблицы в столбце eventsId.

Есть ли способ сделать это, используя аннотацию? Если нет, то как я могу вручную создать соединение с новым Entity?

Спасибо.

+0

Вы используете Hibernate, Toplink, ...? –

+0

@ ŁukaszRżanek Я использую jpa, но могу добавить Hibernate. – inglor

+0

'@ Index' in не будет работать ни в простой JPA, ни в Hibernate. Вы можете вручную добавить индекс. –

ответ

1

В настоящее время вы ничего не можете сделать с помощью аннотаций Java. И это хорошо известная ловушка использования многих со многими из JPA, т. Е. Hibernate.

Teneo (Eclipse EMF) - это реализация, которая может сделать это для вас (создайте необходимые индексы).

Таким образом, на данный момент, вы застряли с ручной создания индекса, выдавшего DDL запрос на РСУБД ...

В противном случае here you will find an example (с дополнительными функциями, но общая идея та же) о том, как создать объединение таблицу вручную.

+0

Так что, прочитав отчет об ошибке, мое предлагаемое решение вручную создать Entity для хранения данных для этих двух объектов было бы хорошим? – inglor

+0

Я думаю, что это единственное решение, доступное прямо сейчас. –

+0

Не могли бы вы указать мне, как это сделать? Я полагаю, что два объекта (событие и моментальный снимок) будут содержать новые переменные для EventSnapJoin '@ OneToMany', да? – inglor

2

Создание индексов из JPA невозможно (хотя поддерживаются UniqueConstraints). Вы должны добавить индекс вручную через вашу СУБД.

Вы можете сделать это, например. с Hibernate и @Index, а затем регенерируйте модель, как только будет установлен this bug in Hibernate. (Я просто оставляю записку на @Index, чтобы показать, что это действительно существует)

+0

Нет, нельзя использовать '@ Index' в этом случае - это известная проблема в Hibernate! Взгляните [здесь] (https://hibernate.onjira.com/browse/HHH-4263) –

+0

@ ŁukaszRżanek обновил ответ, не знал этого! Спасибо за исправление. – DrColossos

0

Очевидно, что не все реализации JPA имеют такую ​​проблему, создавая индексы в таблицах соединений, хотя, очевидно, нет стандартного способа JPA. DataNucleus JPA, безусловно, справляется с этим (поскольку основной код используется JDO тоже, и этот стандарт делает, чтобы там были индексы).