JPA 2.0缓存和插入查询

时间:2014-04-02 21:10:04

标签: caching jpa entity on-duplicate-key

问题描述

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

0 个答案:

没有答案