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啊
Hibernate自动关联更新问题
猜你喜欢
转载自tonydark01.iteye.com/blog/1733483
今日推荐
周排行