hibernate级联更新会把外键id设置为null,这样会留下脏数据,有什么方式可以让hibernate直接删除不关联的数据,再维护相关联数据。
相关代码:
package com.centerm.ivycloud.vcenter.vcompute.dao.instancedao.bean;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Transient;
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;
import org.hibernate.annotations.NotFound;
import org.hibernate.annotations.NotFoundAction;
/**
* 临时实例,用来创建实例时使用
* @author wuyaozong
*
*/
@Entity
@Table( name = "vm" )
public class Instance implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
@Id
@Column(name="id" ,unique=true)
public String id;
@Column(name="name")
public String name;
@Transient
public String description;
@Column(name="status")
public String status;
@Column(name="power_status")
public String powerStatus;
@NotFound(action=NotFoundAction.IGNORE)
@OneToMany(targetEntity=VmNetwork.class, fetch=FetchType.EAGER)
@JoinColumn(name="vm_id",referencedColumnName="id")
@Cascade(value={CascadeType.ALL})
public List<VmNetwork> net;
@Column(name="image_id")
public String imageId;
@Column(name="image_name")
public String imageName;
@Column(name="os_type")
public String osType;
@Column(name="os_name")
public String osName;
@Column(name="platform")
public String osPlatform;
@Column(name="cluster_id")
public String clusterId;
@Transient
public String clusterName;
@Transient
public Cluster cluster;
@Transient
public Storage storage;
@Column(name="cpu")
public Integer cpu;
@Column(name="ram")
public Long memory;
@Column(name="system_disk")
public Integer systemDisk;
@Column(name="storage_id")
public String storageId;
@Transient
public String storageName;
@NotFound(action=NotFoundAction.IGNORE)
@OneToMany(targetEntity=Volume.class,fetch=FetchType.EAGER)
@Cascade(value={CascadeType.ALL,CascadeType.DELETE})
@JoinTable(name="vm_volume_rel",
joinColumns={@JoinColumn(name="vm_id",referencedColumnName="id")},
inverseJoinColumns={@JoinColumn(name="volume_id",referencedColumnName="id")})
public List<Volume> userDisks;
@Column(name="is_persist")
public boolean isPersist;
@Column(name="delete_time")
public Date deleteTime;
@Transient
public Date updatedTime;
@Column(name="vm_type")
public String vmType;
@Column(name="error_des")
public String errorDes;
@Column(name="last_modify_result")
public Integer lastModifyResult;
@Column(name="sn" ,insertable=false,updatable=false)
@GeneratedValue(strategy=GenerationType.IDENTITY)
public Long sn;
public Instance() {
super();
}
public Instance(String id,String name){
this.id=id;
this.name=name;
}
public Instance(String id,String name,String status,String powerStatus,
String imageId,String imageName,String osType,
String osName,String osPlatform,String clusterId,
Long memory, Integer cpu,String storageId,
boolean isPersist,String vmType,Long sn
) {
this.id=id;
this.name=name;
this.status=status;
this.powerStatus=powerStatus;
this.imageId=imageId;
this.imageName=imageName;
this.osType=osType;
this.osName=osName;
this.osPlatform=osPlatform;
this.clusterId=clusterId;
this.memory=memory;
this.cpu=cpu;
this.storageId=storageId;
this.isPersist=isPersist;
this.vmType=vmType;
this.sn=sn;
}
}
package com.centerm.ivycloud.vcenter.vcompute.dao.instancedao.bean;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name="vm_network")
public class VmNetwork {
@Id
@Column(name="id")
public long id;
@Column(name="network_id")
public String networkId="";
@Column(name="vm_id")
public String vmId="";
@Column(name="mac")
public String macAddr="";
@Column(name="fixed_ipv4")
public String fixedIPV4="";
@Column(name="float_ipv4")
public String floatIPV4="";
@Column(name="fixed_ipv6")
public String fixedIPv6="";
@Column(name="float_ipv6")
public String floatIPv6="";
public VmNetwork() {
super();
}
public VmNetwork(String networkId,String vmId,String macAddr,String fixedIpv4,
String floatIpv4,String fixedIpv6,String floatIpv6) {
this.networkId=networkId;
this.vmId=vmId;
this.macAddr=macAddr;
this.fixedIPV4=fixedIpv4;
this.floatIPV4=floatIpv4;
this.fixedIPv6=fixedIpv6;
this.floatIPv6=floatIpv6;
}
}
hibernate执行的sql语句:
Hibernate:
update vm set cluster_id=?, cpu=?, delete_time=?, error_des=?,
image_id=?, image_name=?, is_persist=?, last_modify_result=?, ram=?,
name=?, os_name=?, platform=?, os_type=?, power_status=?, status=?,
storage_id=?, system_disk=?, vm_type=? where id=?
Hibernate:
update vm_network set fixed_ipv4=?, fixed_ipv6=?, float_ipv4=?,
float_ipv6=?, mac=?, network_id=?, vm_id=? where id=?
Hibernate:
update volume set create_time=?, description=?, encrypted=?,
last_modify_result=?, name=?, size=?, status=?, storage_id=?, switch=?
where id=?
Hibernate:
update volume set create_time=?, description=?, encrypted=?,
last_modify_result=?, name=?, size=?, status=?, storage_id=?, switch=?
where id=?
Hibernate:
update vm_network set vm_id=null where vm_id=?
Hibernate:
delete from vm_volume_rel where vm_id=?
Hibernate:
update vm_network set vm_id=? where id=?
Hibernate:
insert into vm_volume_rel (vm_id, volume_id) values (?, ?)
Hibernate:
insert into vm_volume_rel (vm_id, volume_id) values (?, ?)
有什么方式,可以让hibernate先把已经与vm表不需要关联的vm_network数据删掉而不是把vm_network的vm_id设置为null,再更新关联关系?谢谢。