Spring merge - java.sql.SQLException:列索引无效

时间:2014-01-16 04:15:11

标签: spring oracle hibernate merge

我有一个包含2列创建主键的表:

@Entity 
@Table(name="DW.DW$SF$MONTHLY")
public class DWMonthly implements Serializable {
    private static final long serialVersionUID = 1L;

    @EmbeddedId DWMonthlyPK monthlyPK;

    @Id
    @Column(name="AID", insertable=false, updatable=false)
    @IndexColumn(name="DW$SF$MONTHLY_PK")
    private Long id;

    @Column(name="CHNG_STATUS")
    private BigDecimal chngStatus;

    @Column(name="NAR")
    private BigDecimal nar;

    @Column(name="SF_AMID")
    private String sfAmid;

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name="N_DATE", insertable=false, updatable=false)
    @IndexColumn(name="DW$SF$MONTHLY_PK")
    private Date nDate;

    public DWMonthly() {}

    public DWMonthly(Long id, String sfAmid, Date nDate) {
        this.id = id;
        this.sfAmid = sfAmid;
        this.nDate = nDate;
    }

    public Long getId() {
        return this.id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public BigDecimal getChngStatus() {
        return this.chngStatus;
    }

    public void setChngStatus(BigDecimal chngStatus) {
        this.chngStatus = chngStatus;
    }

    public BigDecimal getNar() {
        return this.nar;
    }

    public void setNar(BigDecimal nar) {
        this.nar = nar;
    }

    public String getSfAmid() {
        return this.sfAmid;
    }

    public void setSfAmid(String sfAmid) {
        this.sfAmid = sfAmid;
    }

    public Date getNDate() {
        return nDate;
    }

    public void setNarDate(Date nDate) {
        this.nDate = nDate;
    }
}

可嵌入表:

@Embeddable
public class DWMonthlyPK implements Serializable {

    private static final long serialVersionUID = 1L;

    @Column(name="AID")
    private long aid;

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name="N_DATE")
    private java.util.Date nDate;

    public DWMonthlyPK() {
    }
    public long getAid() {
        return this.aid;
    }
    public void setAid(long aid) {
        this.aid = aid;
    }
    public java.util.Date getNDate() {
        return this.narDate;
    }
    public void setNDate(java.util.Date nDate) {
        this.nDate = nDate;
    }

    public boolean equals(Object other) {
        if (this == other) {
            return true;
        }
        if (!(other instanceof DWMonthlyPK)) {
            return false;
        }
        DWMonthlyPK castOther = (DWMonthlyPK)other;
        return 
            (this.aid == castOther.aid)
            && this.nDate.equals(castOther.nDate);
    }

    public int hashCode() {
        final int prime = 31;
        int hash = 17;
        hash = hash * prime + ((int) (this.aid ^ (this.aid >>> 32)));
        hash = hash * prime + this.nDate.hashCode();

        return hash;
    }
}

查找记录并更新:

@Repository(value="MonthlyNarDaoRepository")
@Import({JpaConfigurationImpl.class})
@Transactional(value="dwTransactionManager",readOnly = true, propagation=Propagation.REQUIRES_NEW)
public class MonthlyNarDaoImpl implements MonthlyNarDao {

        @Override
    @Transactional(value="dwTransactionManager")
    public void findAndUpdateMonhtlyByAccountId(Map<DWAccount, UpsertResult> accountsLoadedResult) {
        for (DWAccount dwAccount : accountsLoadedResult.keySet()){
            try {
                CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
                CriteriaQuery<DWMonthlyNar> criteriaQuery = criteriaBuilder.createQuery(DWMonthlyNar.class);
                Root<DWMonthlyNar> root = criteriaQuery.from(DWMonthlyNar.class);

                Predicate p = criteriaBuilder.conjunction();
                p = criteriaBuilder.and(criteriaBuilder.equal(root.get("id"), dwAccount.getId()), criteriaBuilder.notEqual(root.get("nar").as(BigDecimal.class), new BigDecimal(0.0)), criteriaBuilder.isNull(root.get("sfAmid"))); 
                criteriaQuery.select(root); 
                criteriaQuery.where(p);
                for (DWMonthlyNar dwMonthlyNar : this.entityManager.createQuery(criteriaQuery).getResultList()){
                    if (dwMonthlyNar.getSfAmid()==null || !dwMonthlyNar.getSfAmid().equals(accountsLoadedResult.get(dwAccount).getId())){
                        dwMonthlyNar.setSfAmid(accountsLoadedResult.get(dwAccount).getId());
                        this.entityManager.merge(dwMonthlyNar);
                    }
                }
            }  catch (Exception e) {
                logger.error("MonthlyNarDaoImpl.findAndUpdateMonhtlyNarByAccountId(): " + e.getMessage());
            }
        }
    }
}

错误:

  

休眠:更新DW.DW $ SF $ MONTHLY设置CHNG_STATUS =?,NAR = ?,   SF_AMID =? AID =?和NAR_DATE =? 16:04:58.864 [主要] DEBUG   o.h.e.jdbc.spi.SqlExceptionHelper - 列索引无效[n / a]   java.sql.SQLException:列索引无效

0 个答案:

没有答案