Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JPA:Cascade remove不删除子级_Jpa_Cascade - Fatal编程技术网

JPA:Cascade remove不删除子级

JPA:Cascade remove不删除子级,jpa,cascade,Jpa,Cascade,编辑:修改问题以更好地反映问题。最初发布的问题 我有一个父(Context)和一个子(User)实体(manytone关系)。父级上的级联“删除”未删除子级。代码如下: //Owning side - child @Entity public class User { @Id @GeneratedValue(strategy = GenerationType.AUTO) private int id; @Column(name = DBColumns.USER_N

编辑:修改问题以更好地反映问题。最初发布的问题

我有一个父(
Context
)和一个子(
User
)实体(manytone关系)。父级上的级联“删除”未删除子级。代码如下:

//Owning side - child
@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;
    @Column(name = DBColumns.USER_NAME)
    private String name;
    @ManyToOne
    @JoinColumn(name = DBColumns.CONTEXT_ID)
    private Context context;
}

//parent
@Entity
public class Context {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;
    @Column(name = DBColumns.CONTEXT_NAME)
    private String name;
    @OneToMany(mappedBy = "context", fetch = FetchType.LAZY, cascade = CascadeType.REMOVE, orphanRemoval = true)
    private Set<User> users = new HashSet<User>();
}

//usage
Context sampleContext = new Context("sampleContext");
em.persist(sampleContext);
User sampleUser = new User(sampleContext, "sampleUser");
em.persist(sampleUser);
em.remove(sampleContext); //should remove user as well but throws foreign key dependency error
//拥有方-子
@实体
公共类用户{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
私有int-id;
@列(name=DBColumns.USER\u name)
私有字符串名称;
@许多酮
@JoinColumn(name=DBColumns.CONTEXT\u ID)
私人语境;
}
//母公司
@实体
公共类上下文{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
私有int-id;
@列(name=DBColumns.CONTEXT\u name)
私有字符串名称;
@OneToMany(mappedBy=“context”,fetch=FetchType.LAZY,cascade=CascadeType.REMOVE,orphanremove=true)
private Set users=new HashSet();
}
//用法
上下文sampleContext=新上下文(“sampleContext”);
em.persist(sampleContext);
用户sampleUser=新用户(sampleContext,“sampleUser”);
em.persist(sampleUser);
em.remove(sampleContext)//也应该删除用户,但抛出外键依赖项错误

不要将关系表映射为en实体。改为使用
@ManyToMany
,并使您的用户实体成为关系的所有者

编辑:

因此,您的关联表主键必须由两个外键组成

请参见此

您正在对sampleUser not sampleContext调用remove(),并且用户不会将remove级联到上下文,因此您应该只看到正在删除的用户


如果对sampleContext调用remove(),还必须确保在创建用户时将该用户添加到上下文的用户中。您很可能只设置了用户的conext。

在删除实体之前,我需要刷新实体:

em.refresh(sampleContext);
em.remove(sampleContext);

之前,被删除的实体(
sampleContext
)不知道
sampleUser
与之关联(可能是因为
sampleContext
是从缓存中提取的)。在
delete
之前执行
refresh
可确保从数据库中更新实体。

我希望将其分开,以便以后可以使用字符串而不是直接实体指定映射(以方便正则表达式)。例如,我想通过映射
user:role::*:employee
,说“所有
用户
都属于
员工
角色”。谢谢链接。它提供了信息。然而,我也有很多人际关系的问题。编辑问题以使问题更清楚。更正了打字错误。它必须是
remove(sampleContext)
。此解决方案有效。但是,不需要手动将
用户
添加到
上下文
的用户中。JPA自己做这件事。顺便说一下,我只需要刷新
上下文
,然后删除它(这样它的
用户
就可以从数据库中更新了)。如果指定orphanRemoving=true,则无需添加CascadeType.REMOVE。(见JSR338第2.9节)