0

2 つの Web サービス API があります。1 つの API では、エンティティを取得して SRO として返します。私は別のAPI、SROを受け取り、それをエンティティに変換して使用します

sessionFactory.getCurrentSession().merge(code);

ただし、次の例外が発生します。同じ理由を見つけるのを手伝ってください。

org.springframework.orm.hibernate3.HibernateOptimisticLockingFailureException: Object of class [PartnerPromoCode] with identifier [254874]: optimistic locking failed; nested exception is org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [PartnerPromoCode#254874]
at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:683)
at org.springframework.orm.hibernate3.HibernateExceptionTranslator.convertHibernateAccessException(HibernateExceptionTranslator.java:89)
at org.springframework.orm.hibernate3.HibernateExceptionTranslator.translateExceptionIfPossible(HibernateExceptionTranslator.java:68)
at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:58)
at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:213)
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:163)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:155)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:199)
at sun.proxy.$Proxy48.updatePartnerPromoCode(Unknown Source)
at abc.updatePartnerPromoCode(abc.java:567)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:616)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:307)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:199)
at sun.proxy.$Proxy54.updatePartnerPromoCode(Unknown Source)
at abc.updatePartnerPromoCode(ServiceDealWebServiceController.java:272)
at xyz$$FastClassByCGLIB$$c65431c6.invoke(<generated>)
at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:149)

編集

エンティティ @Entity @Table(name = "partner_promo_code", catalog = "snapdeal") @NamedQueries({ @NamedQuery(name = QueryNames.GET_UNUSED_PARTNER_PROMO_CODE, query = "select p from PartnerPromoCode p where p.status=0 and p .partnerCode = :partnerCode and p.catalogId = :catalogId p.id による順序")、@NamedQuery(name = QueryNames.GET_PARTNER_PROMO_CODE_BY_PROMO、query = "from PartnerPromoCode where partnerCode = :partnerCode and promoCode = :promoCode") }) public class PartnerPromoCode は java.io.Serializable を実装します {

public static final Boolean STATUS_USED      = true;
public static final Boolean STATUS_NOT_USED  = false;
/**
 * 
 */
private static final long   serialVersionUID = 7786688992136091701L;
private Integer             id;
private String              partnerCode;
private String              promoCode;
private Boolean             status;
private Date                expiry;
private Date                created;
private Date                updated;

public PartnerPromoCode() {
}

public PartnerPromoCode(String partnerCode, String promoCode) {
    this.partnerCode = partnerCode;
    this.promoCode = promoCode;
    this.status = STATUS_NOT_USED;
}

@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "id", unique = true, nullable = false)
public Integer getId() {
    return this.id;
}

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

@Column(name = "partner_code")
public String getPartnerCode() {
    return partnerCode;
}

public void setPartnerCode(String partnerCode) {
    this.partnerCode = partnerCode;
}

@Column(name = "promo_code")
public String getPromoCode() {
    return promoCode;
}

public void setPromoCode(String promoCode) {
    this.promoCode = promoCode;
}

@Column(name = "status")
public Boolean getStatus() {
    return status;
}

public void setStatus(Boolean status) {
    this.status = status;
}

@Temporal(TemporalType.TIMESTAMP)
@Column(name = "expiry", nullable = false, length = 19)
public Date getExpiry() {
    return expiry;
}

public void setExpiry(Date expiry) {
    this.expiry = expiry;
}

@Temporal(TemporalType.TIMESTAMP)
@Column(name = "created", nullable = false, length = 19)
public Date getCreated() {
    return created;
}

public void setCreated(Date created) {
    this.created = created;
}

@Version
@Column(name = "updated", nullable = false, length = 19)
public Date getUpdated() {
    return updated;
}

public void setUpdated(Date updated) {
    this.updated = updated;
}

}

ID でエンティティを取得し、それを SRO に変換して、ネットワーク経由で渡します...その後、sro を受け取り、新しいエンティティ オブジェクトを作成し、ID と他のすべてのフィールドを設定し、更新されたフィールドを現在の時刻からエンティティをマージしようとしますsessionFactory.getSession().merge(obj)

4

1 に答える 1

0

で注釈が付けられたフィールドの値が@Version、データベースに保存されている値と一致しないため (または、データベースの行がもう存在しないため)。

于 2013-04-05T09:27:01.070 に答える