Spring MVC +jpa 删除联合主键表数据

来源:互联网 发布:c语言两个等于号 编辑:程序博客网 时间:2024/06/06 03:23

直奔主题:  jpa 做持久化时,想删除 一个有联合主键表中的 一条数据,看了jpa里面提供的 delete方法,

1.em.remove(entity); 一种是按照实体对象来删除的,但是这个实体对象 是有状态的,如果 你传递的实体对象参数是游离的那么删除是不被允许的会报如下错误:

Caused by: java.lang.IllegalArgumentException: Removing a detached instance  xxx

所以想要用这种方式删除表数据的话必须要 先去数据库查出来这条数据然后根据查出来的实体对象 当参数再去删除才会成功。


2.em.remove(em.getReference(entityClass, entityId));  我们来看下这个方法 他明显是通过主键ID 来删除表中数据的。可是我的是联合主键怎么破?问题来了。苦闷了很久,跟进去em.getReference(entityClass, entityId)方法 看了下参数注释 :

Parameters:
entityClass entity class
primaryKey primary key
上边是这样写的,第二个参数 (entityID)不是单个主键ID 而是primaryKey  ,也就是说 可以是个联合主键,我被自己的第一意识忽悠了(看来有的时候自己是不可信的,还不如信API)。

注意:联合主键表在做持久化时 必须要定义这个联合主键类 。如:

持久化实体对象:

@Entity
@IdClass(RoleToMenuPK.class)
@Table(name = "m_roletomenu", schema="wlshop")
public class RoleToMenu implements Serializable {

    private static final long serialVersionUID = 2475854169969988403L;
    @Id
    private Integer fk_role_id;
    @Id
    private Integer fk_menu_id;

    
    public RoleToMenu(){}
    public RoleToMenu(Integer fk_role_id,Integer fk_menu_id){
        this.fk_role_id = fk_role_id;
        this.fk_menu_id = fk_menu_id;
    }
    public Integer getFk_role_id() {
        return fk_role_id;
    }
    public void setFk_role_id(Integer fk_role_id) {
        this.fk_role_id = fk_role_id;
    }
    public Integer getFk_menu_id() {
        return fk_menu_id;
    }
    public void setFk_menu_id(Integer fk_menu_id) {
        this.fk_menu_id = fk_menu_id;
    }
    
}

持久化实体对象对应的主键类:

public class RoleToMenuPK implements Serializable {

    private static final long serialVersionUID = 2475854169969988403L;
    private Integer fk_role_id;
    private Integer fk_menu_id;
    
    public RoleToMenuPK(){}
    public RoleToMenuPK(Integer fk_role_id,Integer fk_menu_id){
        this.fk_role_id = fk_role_id;
        this.fk_menu_id = fk_menu_id;
    }
    public Integer getFk_role_id() {
        return fk_role_id;
    }
    public void setFk_role_id(Integer fk_role_id) {
        this.fk_role_id = fk_role_id;
    }
    public Integer getFk_menu_id() {
        return fk_menu_id;
    }
    public void setFk_menu_id(Integer fk_menu_id) {
        this.fk_menu_id = fk_menu_id;
    }
    
    @Override  
    public boolean equals(Object obj)  

    {  
 
        if (this == obj)  
        return true;  
        else
        return false;  
    }  
    @Override  
    public int hashCode()  

    {  
        int result = 17;
        result = 37 * result + fk_role_id.hashCode();
        result = 37 * result + fk_menu_id;
        return result;
    }  
}


注意这里的 equals 方法和 hashcode方法是必须要 重写的,不然再删除查询的时候回报错。

0 0
原创粉丝点击