【发布时间】:2015-08-28 05:05:02
【问题描述】:
org.hibernate.HibernateException: 实例标识符 org.com.Pricing 从 241 更改为 242
我遇到了这个异常。我有一个名为应用程序的实体,它映射到应用程序表。当应用程序同时被持久化时,一些默认值应该被持久化到另一个名为 Pricing 的表中。
该项目是一个动态的网络项目,有一定数量的用户可以登录。并且任何用户都可以创建一个应用程序,当他们点击 sav 时,实体应该被保存在数据库中。
当单个用户进行保存时,它工作正常......但是当 3-4 个用户尝试同时保存时,它会抛出上述异常。正在创建应用程序,但在保持定价时出现上述异常。
我们使用带有 Spring 集成的 Hibernate 4,并且 Hibernate 模板用于事务。 有什么办法可以解决这个问题。
@Transactional
public class ApplicationDao extends BaseDao {
private Application application = null;
/**
* Bean Injection Start
* @param applicationDTO
* @return
*/
public void setApplication(Application application) {
this.application = application;
}
/**
* End
*/
@SuppressWarnings("unchecked")
public int persistApplication(ApplicationDTO applicationDTO){
String appName = null;
int appId = -1;
Session session = getHibernateTemplate().getSessionFactory().getCurrentSession();
Query query = session.createQuery("from Application app where app.APP_NAME=:APP_NAME and app.OWNER_ID=:OWNER_ID");
query.setParameter("APP_NAME", applicationDTO.getAPP_NAME());
List<Application> applicationList = query.list();
for(Application application : applicationList){
appName = application.getAPP_NAME();
}
if(appName ==null || appName ==""){
appName = "NO_DATA";
}
if(appName.equalsIgnoreCase(applicationDTO.getPP_NAME())){
System.out.println("app Name Already Exist");
appId = -1;
}
else
{
try{
BeanUtils.copyProperties(application, applicationDTO);
appId=application.getAPP_ID();
}catch(ConversionException coversionExc){
coversionExc.printStackTrace();
}catch(IllegalAccessException illegalAccessExce){
illegalAccessExce.printStackTrace();
}catch(InvocationTargetException invocationTargetExce){
invocationTargetExce.printStackTrace();
}
saveOrUpdate(application);
appId=application.getAPP_ID();
System.out.println("app id "+appId);
}
return appId;
}
public class BaseDao extends HibernateDaoSupport {
protected void saveOrUpdate(Object entity) {
getHibernateTemplate().saveOrUpdate(entity);
getHibernateTemplate().flush();
}
protected HibernateTemplate getTemplate() {
return getHibernateTemplate();
}
}
@Entity
public class Application{
@Id
@GenericGenerator(name="generator", strategy="increment")
@GeneratedValue(generator="generator")
private int APP_ID;
@Column
private String APP_NAME;
public int getAPP_ID() {
return APP_ID;
}
public void setAPP_ID(int aPP_ID) {
APP_ID = aPP_ID;
}
public String getAPP_NAME() {
return APP_NAME;
}
public void setAPP_NAME(String aPP_NAME) {
APP_NAME = aPP_NAME;
}
}
@Entity
public class Pricing {
@Id
@GenericGenerator(name="generator", strategy="increment")
@GeneratedValue(generator="generator")
private int Pricing_ID;
@Column
private int APP_ID;
@Column
private double PRICE;
public int getAPP_ID() {
return APP_ID;
}
public void setAPP_ID(int aPP_ID) {
APP_ID = aPP_ID;
}
public int getPricing_ID() {
return Pricing_ID;
}
public void setPricing_ID(int pricing_ID) {
Pricing_ID = pricing_ID;
}
public double getPRICE() {
return PRICE;
}
public void setPRICE(double pRICE) {
PRICE = pRICE;
}
}
以下是Application Context xml文件中的内容。
<property name="dataSource" ref="mySQLDBConnectionDetails"></property>
<property name="annotatedClasses">
<list>
<value>org.com.Application</value>
<value>org.com.Pricing</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
</props>
</property>
</bean>
<tx:annotation-driven proxy-target-class="true"
transaction-manager="transactionManager" />
<bean id="transactionManager"
class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="mysessionFactory" />
</bean>
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate4.HibernateTemplate">
<property name="sessionFactory" ref="mysessionFactory" />
</bean>
如果需要任何信息,也会提供该信息...提前致谢。
【问题讨论】:
-
请编辑并发布:应用程序/定价类以及更新应用程序实例的代码
-
与具体问题无关,但您应该考虑使用乐观锁定,尤其是,因为多个用户可以创建/编辑同一个应用程序实体。这是一个例子docs.jboss.org/hibernate/orm/4.0/devguide/en-US/html/ch05.html