問題:
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
我在論壇上看看別以前發的帖子,沒有找到答案,求解呀!
子類:
- 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;
- }
- }
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;
}
}
父類:
- 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;
- }
- }
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的內容如下:
- <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>
<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>
有沒有下面這兩行都是報那個錯誤.
執行刪除或更新其它字段都沒有問題.
- String cargoTypeId = request.getParameter("cargoType.cargoTypeId");
- cargo.setCargoType(cargoTypeManager.get(cargoTypeId));
- 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,問題還是照樣存在.