Hibernate自动关联更新问题

Hibernate自动关联更新
最近项目一个一个问题

由hibernateTools生成的对象中已经做好关联关系

对象A:
package net.esj.model;
// Generated 2012-11-14 15:20:18 by Hibernate Tools 3.2.0.beta8


import java.util.ArrayList;
import java.util.List;
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 net.esj.basic.pojo.AbstractPojo;

import org.hibernate.annotations.GenericGenerator;

/**
* HdFormSubject generated by hbm2java
*/
@Entity
@Table(name="HD_FORM_SUBJECT"
    , uniqueConstraints = {  }
)
@org.hibernate.annotations.Entity(dynamicUpdate=true)
public class HdFormSubject extends AbstractPojo<String> implements java.io.Serializable {

    // Fields   

/**
     */
private String id;

/**
     */
private HdActForm hdActForm;

/**
     */
private String title;

/**
     */
private String parentId;

/**
     */
private Long index;

/**
     */
private Long rank;

private Boolean required;

private String typeCode;

/**
     */
private List<HdFormSubjectColumn> hdFormSubjectColumns = new ArrayList<HdFormSubjectColumn>();


     // Constructors

    /** default constructor */
    public HdFormSubject() {
    }

    /** full constructor */
    public HdFormSubject(HdActForm hdActForm, String title, String parentId, Long index, Long rank, List<HdFormSubjectColumn> hdFormSubjectColumns) {
       this.hdActForm = hdActForm;
       this.title = title;
       this.parentId = parentId;
       this.index = index;
       this.rank = rank;
       this.hdFormSubjectColumns = hdFormSubjectColumns;
    }
  
    // Property accessors
    /**      
     */
     @Id
    @Column(name="ID", unique=true, nullable=false, insertable=true, updatable=true)
    public String getId() {
        return this.id;
    }
   
    /**
     */ 
    public void setId(String id) {
        this.id = id;
    }
    /**      
     */
@ManyToOne(cascade={},
        fetch=FetchType.LAZY)
   
    @JoinColumn(name="ACT_ID", unique=false, nullable=true, insertable=true, updatable=true)
    public HdActForm getHdActForm() {
        return this.hdActForm;
    }
   
    /**
     */ 
    public void setHdActForm(HdActForm hdActForm) {
        this.hdActForm = hdActForm;
    }
    /**      
     */
   
    @Column(name="TITLE", unique=false, nullable=true, insertable=true, updatable=true, length=256)
    public String getTitle() {
        return this.title;
    }
   
    /**
     */ 
    public void setTitle(String title) {
        this.title = title;
    }
    /**      
     */
   
    @Column(name="PARENT_ID", unique=false, nullable=true, insertable=true, updatable=true)
    public String getParentId() {
        return this.parentId;
    }
   
    /**
     */ 
    public void setParentId(String parentId) {
        this.parentId = parentId;
    }
    /**      
     */
   
    @Column(name="\"INDEX\"", unique=false, nullable=true, insertable=true, updatable=true, precision=22, scale=0)
    public Long getIndex() {
        return this.index;
    }
   
    /**
     */ 
    public void setIndex(Long index) {
        this.index = index;
    }
    /**      
     */
   
    @Column(name="RANK", unique=false, nullable=true, insertable=true, updatable=true, precision=22, scale=0)
    public Long getRank() {
        return this.rank;
    }
   
    /**
     */ 
    public void setRank(Long rank) {
        this.rank = rank;
    }
    /**      
     */
    @OneToMany(cascade={CascadeType.ALL},targetEntity=net.esj.model.HdFormSubjectColumn.class, fetch=FetchType.LAZY, mappedBy="hdFormSubject")
    public List<HdFormSubjectColumn> getHdFormSubjectColumns() {
        return this.hdFormSubjectColumns;
    }
   
    /**
     */ 
    public void setHdFormSubjectColumns(List<HdFormSubjectColumn> hdFormSubjectColumns) {
        this.hdFormSubjectColumns = hdFormSubjectColumns;
    }

    @Column(name="REQUIRED", unique=false, nullable=true, insertable=true, updatable=true,  scale=0)
public Boolean getRequired() {
return required;
}

public void setRequired(Boolean required) {
this.required = required;
}

@Column(name="TYPE_CODE", unique=false, nullable=true, insertable=true, updatable=true)
public String getTypeCode() {
return typeCode;
}

public void setTypeCode(String typeCode) {
this.typeCode = typeCode;
}

public String genJsCode(){
StringBuilder sb = new StringBuilder();
sb.append("{").append("id:\"").append(id).append("\",")
.append("title:\"").append(title==null?"":title).append("\",")
.append("parentId:\"").append(parentId==null?"":parentId).append("\",")
.append("index:").append(index).append(",")
.append("rank:").append(rank==null?0:rank).append(",")
.append("required:").append(required==null?false:required).append(",")
.append("JS_FUNC:").append(typeCode==null?"":typeCode).append(",")
.append("typeCode:\"").append(typeCode==null?"":typeCode).append("\"}");

return sb.toString();
}


}


对象B:
package net.esj.model;
// Generated 2012-11-14 15:20:18 by Hibernate Tools 3.2.0.beta8


import java.math.BigDecimal;
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.Table;
import net.esj.basic.pojo.AbstractPojo;

import org.hibernate.annotations.GenericGenerator;

/**
* HdFormSubjectColumn generated by hbm2java
*/
@Entity
@Table(name="HD_FORM_SUBJECT_COLUMN"
    , uniqueConstraints = {  }
)
@org.hibernate.annotations.Entity(dynamicUpdate=true)
public class HdFormSubjectColumn extends AbstractPojo<String> implements java.io.Serializable {

    // Fields   

/**
     */
private String id;

/**
     */
private HdFormSubject hdFormSubject;

/**
     */
private String title;

/**
     */
private String type;

/**
     */
private String typeExtra;

/**
     */
private String expressions;

/**
     */
private Long minLength;

/**
     */
private Long maxLength;

/**
     */
private Long index;

/**
     */
private Byte resultType;

/**
     */
private String defaultValue;

/**
     */
private String defaultMapping;

private String comments;

     // Constructors

    /** default constructor */
    public HdFormSubjectColumn() {
    }

    /** full constructor */
    public HdFormSubjectColumn(HdFormSubject hdFormSubject, String title, String type, String typeExtra, String expressions, Long minLength, Long maxLength, Long index, Byte resultType, String defaultValue, String defaultMapping) {
       this.hdFormSubject = hdFormSubject;
       this.title = title;
       this.type = type;
       this.typeExtra = typeExtra;
       this.expressions = expressions;
       this.minLength = minLength;
       this.maxLength = maxLength;
       this.index = index;
       this.resultType = resultType;
       this.defaultValue = defaultValue;
       this.defaultMapping = defaultMapping;
    }
  
    // Property accessors
    /**      
     */
    @Id
    @Column(name="ID", unique=true, nullable=false, insertable=true, updatable=true)
    public String getId() {
        return this.id;
    }
   
    /**
     */ 
    public void setId(String id) {
        this.id = id;
    }
    /**      
     */
@ManyToOne(cascade={javax.persistence.CascadeType.REMOVE},
        fetch=FetchType.LAZY)
    @JoinColumn(name="SUBJECT_ID", unique=false, nullable=true, insertable=true, updatable=true)
    public HdFormSubject getHdFormSubject() {
        return this.hdFormSubject;
    }
   
    /**
     */ 
    public void setHdFormSubject(HdFormSubject hdFormSubject) {
        this.hdFormSubject = hdFormSubject;
    }
    /**      
     */
   
    @Column(name="TITLE", unique=false, nullable=true, insertable=true, updatable=true, length=128)
    public String getTitle() {
        return this.title;
    }
   
    /**
     */ 
    public void setTitle(String title) {
        this.title = title;
    }
    /**      
     */
   
    @Column(name="TYPE", unique=false, nullable=true, insertable=true, updatable=true, length=64)
    public String getType() {
        return this.type;
    }
   
    /**
     */ 
    public void setType(String type) {
        this.type = type;
    }
    /**      
     */
   
    @Column(name="TYPE_EXTRA", unique=false, nullable=true, insertable=true, updatable=true, length=64)
    public String getTypeExtra() {
        return this.typeExtra;
    }
   
    /**
     */ 
    public void setTypeExtra(String typeExtra) {
        this.typeExtra = typeExtra;
    }
    /**      
     */
   
    @Column(name="EXPRESSIONS", unique=false, nullable=true, insertable=true, updatable=true, length=256)
    public String getExpressions() {
        return this.expressions;
    }
   
    /**
     */ 
    public void setExpressions(String expressions) {
        this.expressions = expressions;
    }
    /**      
     */
   
    @Column(name="MIN_LENGTH", unique=false, nullable=true, insertable=true, updatable=true, precision=0, scale=0)
    public Long getMinLength() {
        return this.minLength;
    }
   
    /**
     */ 
    public void setMinLength(Long minLength) {
        this.minLength = minLength;
    }
    /**      
     */
   
    @Column(name="MAX_LENGTH", unique=false, nullable=true, insertable=true, updatable=true, precision=0, scale=0)
    public Long getMaxLength() {
        return this.maxLength;
    }
   
    /**
     */ 
    public void setMaxLength(Long maxLength) {
        this.maxLength = maxLength;
    }
    /**      
     */
   
   
    /**      
     */
   
    @Column(name="\"INDEX\"", unique=false, nullable=true, insertable=true, updatable=true, precision=22, scale=0)
    public Long getIndex() {
        return this.index;
    }
   
    /**
     */ 
    public void setIndex(Long index) {
        this.index = index;
    }
    /**      
     */
   
    @Column(name="RESULT_TYPE", unique=false, nullable=true, insertable=true, updatable=true, precision=2, scale=0)
    public Byte getResultType() {
        return this.resultType;
    }
   
    /**
     */ 
    public void setResultType(Byte resultType) {
        this.resultType = resultType;
    }
    /**      
     */
   
    @Column(name="DEFAULT_VALUE", unique=false, nullable=true, insertable=true, updatable=true, length=256)
    public String getDefaultValue() {
        return this.defaultValue;
    }
   
    /**
     */ 
    public void setDefaultValue(String defaultValue) {
        this.defaultValue = defaultValue;
    }
    /**      
     */
   
    @Column(name="DEFAULT_MAPPING", unique=false, nullable=true, insertable=true, updatable=true, length=64)
    public String getDefaultMapping() {
        return this.defaultMapping;
    }
   
    /**
     */ 
    public void setDefaultMapping(String defaultMapping) {
        this.defaultMapping = defaultMapping;
    }

    @Column(name="COMMENTS", unique=false, nullable=true, insertable=true, updatable=true, length=512)
public String getComments() {
return comments;
}

public void setComments(String comments) {
this.comments = comments;
}

public String genJsCode(){
StringBuilder sb = new StringBuilder();
sb.append("{").append("id:\"").append(id).append("\",")
.append("title:\"").append(title==null?"":title).append("\",")
.append("type:\"").append(type==null?"":type).append("\",")
.append("typeExtra:\"").append(typeExtra==null?"":typeExtra).append("\",")
.append("expressions:\"").append(expressions==null?"":expressions).append("\",")
.append("minLength:").append(minLength==null?0:minLength).append(",")
.append("maxLength:").append(maxLength==null?0:maxLength).append(",")
.append("index:").append(index).append(",")
.append("resultType:").append(resultType==null?0:resultType).append(",")
.append("defaultValue:\"").append(defaultValue==null?"":defaultValue).append("\",")
.append("defaultMapping:\"").append(defaultMapping==null?"":defaultMapping).append("\",")
.append("comments:\"").append(comments==null?"":comments).append("\"}");
return sb.toString();
}
}


A中OneToMany关联:
    @OneToMany(cascade={CascadeType.ALL},targetEntity=net.esj.model.HdFormSubjectColumn.class, fetch=FetchType.LAZY, mappedBy="hdFormSubject")
    public List<HdFormSubjectColumn> getHdFormSubjectColumns() {
        return this.hdFormSubjectColumns;
    }
   
当CascadeType.ALL是会自动更新数据

调用的时候:
for(HdFormSubject subject:subjects){
subject.setHdActForm(form);
save(subject);
for(HdFormSubjectColumn col : subject.getHdFormSubjectColumns()){
col.setHdFormSubject(subject);
save(col);
}
}

这时执行的结果:
Hibernate: select hdformsubj_.ID, hdformsubj_.TYPE as TYPE126_, hdformsubj_.DEFAULT_VALUE as DEFAULT3_126_, hdformsubj_."INDEX" as INDEX4_126_, hdformsubj_.MIN_LENGTH as MIN5_126_, hdformsubj_.MAX_LENGTH as MAX6_126_, hdformsubj_.TITLE as TITLE126_, hdformsubj_.COMMENTS as COMMENTS126_, hdformsubj_.SUBJECT_ID as SUBJECT13_126_, hdformsubj_.TYPE_EXTRA as TYPE9_126_, hdformsubj_.EXPRESSIONS as EXPRESS10_126_, hdformsubj_.RESULT_TYPE as RESULT11_126_, hdformsubj_.DEFAULT_MAPPING as DEFAULT12_126_ from HD_FORM_SUBJECT_COLUMN hdformsubj_ where hdformsubj_.ID=?
Hibernate: select hdformsubj_.ID, hdformsubj_.TYPE_CODE as TYPE2_125_, hdformsubj_."INDEX" as INDEX3_125_, hdformsubj_.REQUIRED as REQUIRED125_, hdformsubj_.PARENT_ID as PARENT5_125_, hdformsubj_.TITLE as TITLE125_, hdformsubj_.RANK as RANK125_, hdformsubj_.ACT_ID as ACT8_125_ from HD_FORM_SUBJECT hdformsubj_ where hdformsubj_.ID=?
Hibernate: select hdformsubj_.ID, hdformsubj_.TYPE as TYPE126_, hdformsubj_.DEFAULT_VALUE as DEFAULT3_126_, hdformsubj_."INDEX" as INDEX4_126_, hdformsubj_.MIN_LENGTH as MIN5_126_, hdformsubj_.MAX_LENGTH as MAX6_126_, hdformsubj_.TITLE as TITLE126_, hdformsubj_.COMMENTS as COMMENTS126_, hdformsubj_.SUBJECT_ID as SUBJECT13_126_, hdformsubj_.TYPE_EXTRA as TYPE9_126_, hdformsubj_.EXPRESSIONS as EXPRESS10_126_, hdformsubj_.RESULT_TYPE as RESULT11_126_, hdformsubj_.DEFAULT_MAPPING as DEFAULT12_126_ from HD_FORM_SUBJECT_COLUMN hdformsubj_ where hdformsubj_.ID=?
Hibernate: select hdformsubj_.ID, hdformsubj_.TYPE as TYPE126_, hdformsubj_.DEFAULT_VALUE as DEFAULT3_126_, hdformsubj_."INDEX" as INDEX4_126_, hdformsubj_.MIN_LENGTH as MIN5_126_, hdformsubj_.MAX_LENGTH as MAX6_126_, hdformsubj_.TITLE as TITLE126_, hdformsubj_.COMMENTS as COMMENTS126_, hdformsubj_.SUBJECT_ID as SUBJECT13_126_, hdformsubj_.TYPE_EXTRA as TYPE9_126_, hdformsubj_.EXPRESSIONS as EXPRESS10_126_, hdformsubj_.RESULT_TYPE as RESULT11_126_, hdformsubj_.DEFAULT_MAPPING as DEFAULT12_126_ from HD_FORM_SUBJECT_COLUMN hdformsubj_ where hdformsubj_.ID=?
Hibernate: insert into HD_ACT_FORM (TITLE, COMMENTS, ARTICLE_ID, ID) values (?, ?, ?, ?)
Hibernate: insert into HD_FORM_SUBJECT (TYPE_CODE, "INDEX", REQUIRED, PARENT_ID, TITLE, RANK, ACT_ID, ID) values (?, ?, ?, ?, ?, ?, ?, ?)
Hibernate: insert into HD_FORM_SUBJECT_COLUMN (TYPE, DEFAULT_VALUE, "INDEX", MIN_LENGTH, MAX_LENGTH, TITLE, COMMENTS, SUBJECT_ID, TYPE_EXTRA, EXPRESSIONS, RESULT_TYPE, DEFAULT_MAPPING, ID) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
Hibernate: insert into HD_FORM_SUBJECT_COLUMN (TYPE, DEFAULT_VALUE, "INDEX", MIN_LENGTH, MAX_LENGTH, TITLE, COMMENTS, SUBJECT_ID, TYPE_EXTRA, EXPRESSIONS, RESULT_TYPE, DEFAULT_MAPPING, ID) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
Hibernate: insert into HD_FORM_SUBJECT_COLUMN (TYPE, DEFAULT_VALUE, "INDEX", MIN_LENGTH, MAX_LENGTH, TITLE, COMMENTS, SUBJECT_ID, TYPE_EXTRA, EXPRESSIONS, RESULT_TYPE, DEFAULT_MAPPING, ID) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
Hibernate: update HD_FORM_SUBJECT_COLUMN set SUBJECT_ID=? where ID=?
Hibernate: update HD_FORM_SUBJECT_COLUMN set SUBJECT_ID=? where ID=?
Hibernate: update HD_FORM_SUBJECT_COLUMN set SUBJECT_ID=? where ID=?
看到会自动Update,而且把
for(HdFormSubjectColumn col : subject.getHdFormSubjectColumns()){
col.setHdFormSubject(subject);
save(col);
}
注释掉也没有用

将CascadeType.ALL去除才行
如果说带有级联会自动inert还可以理解,但是最后的update就百思不得其解了。。
而且该Update会把SUBJECT_ID设为NULL,即便hibernate自动更新也不应该是NULL啊

猜你喜欢

转载自tonydark01.iteye.com/blog/1733483
今日推荐