JPA手动创建@JoinTable

时间:2012-02-14 12:30:33

标签: java jpa indexing jointable

嗨,我遇到了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上为该表创建索引。

有没有办法通过使用注释来做到这一点? 如果没有,我如何使用新实体手动创建连接表?

感谢。

3 个答案:

答案 0 :(得分:2)

无法从JPA创建索引(尽管支持UniqueConstraints)。您应该通过DBMS手动添加索引。

你可以这样做,例如使用Hibernate和@Index,然后在this bug in Hibernate修复后立即重新生成模型。 (我只是将注释留在@Index上以表明它确实存在)

答案 1 :(得分:1)

目前,您无法对Java注释做任何事情。这是使用JPA的多对多的一个众所周知的陷阱,即Hibernate

Teneo(Eclipse EMF)是一个可以为您做到这一点的实现(创建必要的索引)。

所以,就目前而言,您仍然无法在RDBMS上发布手动索引创建DDL查询......

其他here you will find an example(有其他功能,但总体思路是相同的)如何手动创建连接表。

答案 2 :(得分:0)

显然,并非所有JPA实现在连接表上创建索引都存在这样的问题,但显然没有JPA标准方法。 DataNucleus JPA肯定会处理它(因为核心代码也被JDO使用,标准 允许那里的索引)。