码农小石头 2016-12-16 06:31 采纳率: 0%
浏览 5343

hibernate级联更新会把外键id设置为null,而是直接删除不关联的数据

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,再更新关联关系?谢谢。

  • 写回答

2条回答 默认 最新

  • dabocaiqq 2016-12-17 03:53
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 树莓派与pix飞控通信
  • ¥15 自动转发微信群信息到另外一个微信群
  • ¥15 outlook无法配置成功
  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题