首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JPA手动创建@JoinTable

JPA手动创建@JoinTable
EN

Stack Overflow用户
提问于 2012-02-14 20:30:33
回答 3查看 1.5K关注 0票数 2

嗨,我有一个关于JPA速度慢的问题。使用jps映射队列模型、队列快照和事件。以下是我的实体:

代码语言:javascript
复制
@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自动创建的Events实体的JoinTable变得非常大,并且随着时间的推移变得越来越慢。

我考虑在列eventsId上为该表创建索引。

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

谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-02-14 20:35:45

目前,您还不能使用Java注解对此做任何事情。这是一个众所周知的陷阱,使用JPA的多对多,即Hibernate

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

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

另外,手动创建连接表的方法也是here you will find an example的(虽然有其他功能,但总体思路相同)。

票数 1
EN

Stack Overflow用户

发布于 2012-02-14 20:36:48

从JPA创建索引是不可能的(尽管支持UniqueConstraints )。您应该通过DBMS手动添加索引。

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

票数 2
EN

Stack Overflow用户

发布于 2012-02-14 22:54:27

显然,并不是所有的JPA实现都有在连接表上创建索引的问题,尽管显然没有JPA标准方法。JDO当然可以处理它(因为核心代码也由DataNucleus使用,并且该标准确实允许在那里使用索引)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9276892

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档