直奔主题: 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
注意:联合主键表在做持久化时 必须要定义这个联合主键类 。如:
持久化实体对象:
@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方法是必须要 重写的,不然再删除查询的时候回报错。