JPA вручную создает @JoinTable - PullRequest
       29

JPA вручную создает @JoinTable

2 голосов
/ 14 февраля 2012

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

@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 для сущности Events, автоматически созданной из JPA, становится довольно большой, и с течением времени она замедляется.

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

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

Спасибо.

Ответы [ 3 ]

2 голосов
/ 14 февраля 2012

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

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

1 голос
/ 14 февраля 2012

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

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

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

В противном случае здесь вы найдете пример (с дополнительными функциями, но общая идея та же), как создать таблицу соединения вручную.

0 голосов
/ 14 февраля 2012

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

...