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

来源:互联网 发布:java object() 编辑:程序博客网 时间:2024/06/05 10:07

問題:

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

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

錯誤如下:
Data Access Failure

identifier of an instance of com.tar.model.CargoType was alteredfrom 402881821bdb7471011bdb75c08e0002 to402881821bdb7471011bdb7586530001; nested exception isorg.hibernate.HibernateException: identifier of an instance ofcom.tar.model.CargoType was altered from402881821bdb7471011bdb75c08e0002 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. }  


父類:

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. }  


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>  


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

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

Java代码
  1. String cargoTypeId = request.getParameter("cargoType.cargoTypeId");  
  2. cargo.setCargoType(cargoTypeManager.get(cargoTypeId));  
  3.               
  4. 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,問題還是照樣存在.

原创粉丝点击