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 执行此操作@Index,然后在修复 Hibernate 中的此错误后立即重新生成模型。(我只是在@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 回答