2

こんにちは、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
}

したがって、私の問題は、JPAから自動的に作成されたイベントエンティティのJoinTableが非常に大きくなり、時間が経つにつれて遅くなるという事実にあります。

私は、eventsId列にそのテーブルのインデックスを作成することを考えました。

アノテーションを使用してそれを行う方法はありますか?そうでない場合、新しいエンティティとのジョイント可能オブジェクトを手動で作成するにはどうすればよいですか?

ありがとう。

4

3 に答える 3

2

JPAからインデックスを作成することはできません(UniqueConstraintsはサポートされていますが)。DBMSを介して手動でインデックスを追加する必要があります。

たとえば、Hibernateを使用してそれを実行し、Hibernateのこのバグが修正さ@Indexれたらすぐにモデルを再生成できます。(これが実際に存在することを示すために、@ Indexにメモを残します)

于 2012-02-14T12:36:48.230 に答える
1

現時点では、Javaアノテーションを使用してそれについて実際に行うことはできません。そして、それはJPAの多対多を使用することのよく知られた落とし穴です。つまりHibernateです。

Teneo(Eclipse EMF)は、それを実行できる(必要なインデックスを作成する)実装です。

したがって、今のところ、RDBMSでDDLクエリを発行する手動のインデックス作成で立ち往生しています...

それ以外の場合は、ここに、結合テーブルを手動で作成する方法の例(追加機能がありますが、一般的な考え方は同じです)があります。

于 2012-02-14T12:35:44.983 に答える
0

明らかに、すべてのJPA実装で結合テーブルにインデックスを作成する際にこのような問題が発生するわけではありませんが、明らかにJPAの標準的な方法はありません。DataNucleus JPAは確かにそれを処理します(コアコードはJDOでも使用され、その標準ではインデックスが許可されているため)。

于 2012-02-14T14:54:26.917 に答える