嗨,我有一个关于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自动创建的Events实体的JoinTable变得非常大,并且随着时间的推移变得越来越慢。
我考虑在列eventsId上为该表创建索引。
有没有办法通过使用注释来做到这一点?如果没有,如何手动创建具有新实体的接合表?
谢谢。
发布于 2012-02-14 20:35:45
目前,您还不能使用Java注解对此做任何事情。这是一个众所周知的陷阱,使用JPA的多对多,即Hibernate。
Teneo (Eclipse EMF)是一个可以为您做这件事的实现(创建必要的索引)。
因此,就目前而言,您只能在RDBMS上手动创建索引并发出DDL查询...
另外,手动创建连接表的方法也是here you will find an example的(虽然有其他功能,但总体思路相同)。
发布于 2012-02-14 20:36:48
从JPA创建索引是不可能的(尽管支持UniqueConstraints )。您应该通过DBMS手动添加索引。
你可以这样做,例如使用Hibernate和@Index,然后在this bug in Hibernate修复后立即重新生成模型。(我只是在@Index上留下笔记,以表明这是真实存在的)
发布于 2012-02-14 22:54:27
显然,并不是所有的JPA实现都有在连接表上创建索引的问题,尽管显然没有JPA标准方法。JDO当然可以处理它(因为核心代码也由DataNucleus使用,并且该标准确实允许在那里使用索引)。
https://stackoverflow.com/questions/9276892
复制相似问题