问题描述
应用程序已升级为使用Eclipselink作为JPA 2.0提供程序并运行一系列Duplicate Key异常。应用程序接收大量流量并使用实体进行大量数据库插入。
最近,该应用程序已升级为使用EclipseLink(JPA2.0)作为JPA提供程序。在此之前,该应用程序使用的是JPA 1.0。下面列出的实体(LoggerEntity)是为JPA 1.0编写的,我们继续将它用于JPA 2.0。但是我们遇到了许多重复的关键异常。
我在帖子中读到JPA 1.0不提供共享缓存,但Eclipselink默认提供共享缓存。
问题 * 1) * 插入查询如何在共享缓存模式下工作。是JPA框架缓存插入查询导致重复键异常。我问这个是因为没有JPA 1.0中的共享缓存模式,这个实体类工作正常
2)由于目前应用已升级为使用JPA 2.0,我应该在实体上设置共享缓存模式,如
@Cache(isolation=CacheIsolationType.ISOLATED, expiry=0, alwaysRefresh=true)
适合JPA 2.0版本。这会有用吗? 我更感兴趣的是插入查询在JPA 2.0中缓存的方式,并以某种方式导致重复的键异常。
我们目前在没有共享缓存模式的JPA 1.0版本中使用的实体类
@Entity
@Table(name="LOGTRANSACT")
public class LoggerEntity implements Serializable {
@EmbeddedId
private LogEntityPK pk;
@Column(name="TRS_CRT_DT")
private Timestamp trsCrtDt;
@Column(name="TRS_CRT_TM")
private Timestamp trsCrtTm;
@Column(name="PRC_NA")
private String prcNa;
@Column(name="TRS_DAT_TE")
private String trsDatTe;
@Column(name="TRS_LOG_RSN_TE")
private String trsLogRsnTe;
@Column(name="REC_UDT_TS")
private Timestamp recUdtTs;
@Column(name="SER_NA")
private String serNa;
@Column(name="CUS_INF_RQT_NR")
private String cusInfRqtNr;
private static final long serialVersionUID = 1L;
public LogEntity() {
super();
}
坚持这样
userTransaction.begin();
LoggerEntity entity = new LoggerEntity();
LogEntityPK pk = new LogEntityPK()
..
..
..
entityManager.persist(entity);
userTransaction.commit();
@Override
public boolean equals(Object o) {
if (o == this) {
return true;
}
if ( ! (o instanceof LogEntityPK)) {
return false;
}
LogEntityPK other = (LogEntityPK) o;
return this.calIdNr.equals(other.calIdNr)
&& this.trsTypCd.equals(other.trsTypCd);
}
@Override
public int hashCode() {
final int prime = 31;
int hash = 17;
hash = hash * prime + this.calIdNr.hashCode();
hash = hash * prime + this.trsTypCd.hashCode();
return hash;
}