many to one FK更新問題求解(identifier of an instance)

問題:

1.getSession().clear();//清除緩存
2.getHibernateTemplate().merge(object);

如果不加第一行,在更新FK時就會報下面的錯誤.這是為什麽?

錯誤如下:
Data Access Failure

identifier of an instance of com.tar.model.CargoType was altered from 402881821bdb7471011bdb75c08e0002 to 402881821bdb7471011bdb7586530001; nested exception is org.hibernate.HibernateException: identifier of an instance of com.tar.model.CargoType was altered from 402881821bdb7471011bdb75c08e0002 to 402881821bdb7471011bdb7586530001

我在論壇上看看別以前發的帖子,沒有找到答案,求解呀!
子類:

Java代码
  1. import java.util.HashSet;  
  2. import java.util.Set;  
  3. import javax.persistence.CascadeType;  
  4. import javax.persistence.Column;  
  5. import javax.persistence.Entity;  
  6. import javax.persistence.FetchType;  
  7. import javax.persistence.GeneratedValue;  
  8. import javax.persistence.Id;  
  9. import javax.persistence.JoinColumn;  
  10. import javax.persistence.ManyToOne;  
  11. import javax.persistence.OneToMany;  
  12. import javax.persistence.Table;  
  13. import org.hibernate.annotations.GenericGenerator;  
  14. public class Cargo extends BaseObject implements java.io.Serializable {  
  15.     private CargoType cargoType = new CargoType();  
  16.     @ManyToOne(cascade = {CascadeType.PERSIST,CascadeType.MERGE})  
  17.     @JoinColumn(name = "cargo_type_id")  
  18.     public CargoType getCargoType() {  
  19.         return this.cargoType;  
  20.     }  
  21.   
  22.     public void setCargoType(CargoType cargoType) {  
  23.         this.cargoType = cargoType;  
  24.     }  
  25. }  
import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import org.hibernate.annotations.GenericGenerator;
public class Cargo extends BaseObject implements java.io.Serializable {
	private CargoType cargoType = new CargoType();
	@ManyToOne(cascade = {CascadeType.PERSIST,CascadeType.MERGE})
	@JoinColumn(name = "cargo_type_id")
	public CargoType getCargoType() {
		return this.cargoType;
	}

	public void setCargoType(CargoType cargoType) {
		this.cargoType = cargoType;
	}
}


父類:

Java代码
  1. import java.util.HashSet;  
  2. import java.util.Set;  
  3. import javax.persistence.CascadeType;  
  4. import javax.persistence.Column;  
  5. import javax.persistence.Entity;  
  6. import javax.persistence.FetchType;  
  7. import javax.persistence.GeneratedValue;  
  8. import javax.persistence.Id;  
  9. import javax.persistence.OneToMany;  
  10. import javax.persistence.Table;  
  11. import org.hibernate.annotations.GenericGenerator;  
  12. public class CargoType extends BaseObject implements java.io.Serializable {  
  13.     private String cargoTypeId;  
  14.     private String cargoTypeName;  
  15.     private Set<Cargo> cargos = new HashSet<Cargo>(0);  
  16.   
  17.     @Column(name = "cargo_type_name", nullable = false)  
  18.     public String getCargoTypeName() {  
  19.         return this.cargoTypeName;  
  20.     }  
  21.   
  22.     public void setCargoTypeName(String cargoTypeName) {  
  23.         this.cargoTypeName = cargoTypeName;  
  24.     }  
  25.   
  26.     @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "cargoType")  
  27.     public Set<Cargo> getCargos() {  
  28.         return this.cargos;  
  29.     }  
  30.   
  31.     public void setCargos(Set<Cargo> cargos) {  
  32.         this.cargos = cargos;  
  33.     }  
  34. }  
import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import org.hibernate.annotations.GenericGenerator;
public class CargoType extends BaseObject implements java.io.Serializable {
	private String cargoTypeId;
	private String cargoTypeName;
	private Set<Cargo> cargos = new HashSet<Cargo>(0);

	@Column(name = "cargo_type_name", nullable = false)
	public String getCargoTypeName() {
		return this.cargoTypeName;
	}

	public void setCargoTypeName(String cargoTypeName) {
		this.cargoTypeName = cargoTypeName;
	}

	@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "cargoType")
	public Set<Cargo> getCargos() {
		return this.cargos;
	}

	public void setCargos(Set<Cargo> cargos) {
		this.cargos = cargos;
	}
}


form jsp的內容如下:

Java代码
  1. <form:select path="cargoType.cargoTypeId" cssClass="select medium" cssErrorClass="select medium error" id="cargoType.cargoTypeId" >  
  2. <form:option value="" label="Please Select"/>  
  3. <form:options items="${cargoTypeList}" itemValue="cargoTypeId" itemLabel="cargoTypeName"/>  
  4. </form:select>  
<form:select path="cargoType.cargoTypeId" cssClass="select medium" cssErrorClass="select medium error" id="cargoType.cargoTypeId" >
<form:option value="" label="Please Select"/>
<form:options items="${cargoTypeList}" itemValue="cargoTypeId" itemLabel="cargoTypeName"/>
</form:select>


有沒有下面這兩行都是報那個錯誤.

執行刪除或更新其它字段都沒有問題.

Java代码
  1. String cargoTypeId = request.getParameter("cargoType.cargoTypeId");  
  2. cargo.setCargoType(cargoTypeManager.get(cargoTypeId));  
  3.               
  4. cargoManager.save(cargo);//調用的是這個方法getHibernateTemplate().merge(object)  
String cargoTypeId = request.getParameter("cargoType.cargoTypeId");
cargo.setCargoType(cargoTypeManager.get(cargoTypeId));
			
cargoManager.save(cargo);//調用的是這個方法getHibernateTemplate().merge(object)


问题补充
與以前一個帖子是相同的問題:
http://www.javaeye.com/topic/112409
但沒有找到答案,請各位幫忙看看.謝謝了~望指教.

===================================================================================

自己測試1:

找一個不可行的方法已經通過了:

把lazyLoadingFilter屏蔽掉可以更新FK,但這個是不能屏蔽的,繼續找方法................

<filter>
        <filter-name>lazyLoadingFilter</filter-name>
        <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
</filter>

 

但是這個不能屏蔽啦.有哪位知道怎么辦嗎?

===================================================================================

自己測試2:

使用XML配置:

還是存在一樣,看樣子不是這個問題.

===================================================================================

自己測試3:

更新FK時使用非session狀態的BO:

String cargoTypeId = request.getParameter("cargoType.cargoTypeId");
CargoType cargoType = new CargoType();
cargoType.setCargoTypeId(cargoTypeId);
cargo.setCargoType(cargoType);
cargoManager.save(cargo);

此方法在struts下是有效,但在spring mvc下無效.why??

===================================================================================

自己測試4:

執行update之前先clear session:

getSession().clear();//清除緩存
return (T) super.getHibernateTemplate().merge(object);

問題好像已經解決了,但不知道有沒有其它影響.請各位指教.

是不是緩存配置有問題,我把hibernate的緩存設置成false,問題還是照樣存在.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值