java - JPA手动创建@JoinTable

标签 java jpa indexing join

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

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

谢谢。

最佳答案

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

Teneo (Eclipse EMF) 是一个可以为您执行此操作的实现(创建必要的索引)。

因此,目前您只能在 RDBMS 上手动创建索引并发出 DDL 查询......

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

关于java - JPA手动创建@JoinTable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9276892/

相关文章:

magento - 无法初始化索引器进程

java - 从 IDEA 连接到嵌入式 tomcat

java - 当前最佳的单元测试 EJB3/JPA 框架

java - JAX-RS 在 GET 中公开 OneToMany 实体

mysql - 索引总和列

Javascript elements.length 返回错误的计数?

java - Spark sql 将字符串转换为日期

java - Hibernate:查询在 CollectionOfElements 中包含指定元素的实体?

java - 已发送电子邮件,但未将密码放入代码中

java - 当表有八列时,在数据库条目中搜索匹配项