1

问题描述

该应用程序已升级为使用 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;
    }
4

0 回答 0