编辑:修改问题以更好地反映问题。此处最初发布的问题
我有一个父实体(< code >上下文)和一个子实体(< code >用户)。父级上的级联“删除”不会删除子级。代码如下:
//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
不要将关系表映射为实体。请改用< code>@ManyToMany,并使您的用户实体成为关系的所有者。
编辑:
所以你的关联表主键必须由两个外键组成。
请参见http://giannigar . WordPress . com/2009/09/04/mapping-a-many-to-many-join-table-with-extra-column-using-JPA/
您是在 sampleUser 而不是 sampleContext 上调用 remove(),并且用户不会级联删除到上下文,因此您应该只看到用户被删除。
如果在 sampleContext 上调用 remove(),则还必须确保在创建用户时已将用户添加到上下文的用户中。您很可能只设置了用户的 conext。
我需要在删除实体之前刷新它:
em.refresh(sampleContext);
em.remove(sampleContext);
早些时候,要删除的实体 (sampleContext
) 不知道 sampleUser
与其关联(可能是因为 sampleContext
是从缓存中获取的)。在删除
之前执行刷新
可确保从数据库更新实体。
主要内容:JPA级联删除示例,输出结果级联移除用于指定如果父实体被移除,则其所有相关实体也将被移除。 以下语法用于执行级联删除操作 - JPA级联删除示例 在这个例子中,我们将创建两个相互关联的实体类,但要建立它们之间的依赖关系,我们将执行级联操作。 这个例子包含以下步骤 - 第1步: 在包下创建一个名为的实体类,其中包含属性:,,以及标记为级联规范的类型的对象。 文件: StudentEntity.java - 第2步: 在包下创建
问题内容: 我对父实体和子实体之间的简单映射有疑问。一切正常,只有当我从集合中删除子记录时,才会删除它们。 父母: 孩子: 如果我现在从childs集合中删除and child,它不会从数据库中删除。我尝试取消引用,但这也不起作用。 实体在Web应用程序中使用,删除是Ajax请求的一部分。按下保存按钮时,我没有已删除子项的列表,因此我无法隐式删除它们。 问题答案: JPA的行为是正确的( 按照规范
我使用此实体表示具有自关系的类别系统,以获取子类别: 问题是当我想删除一个有子类别的类别时。我想删除所有子类别,但Java会删除此异常: 无法删除或更新父行:外键约束失败(,约束外键()引用) 我试图改变一些东西,如孤儿移除=真或级联=CascadeType。删除或尝试将级联放在单独的注释中,但不起作用。 我最后的希望是手动递归删除类别child,但这不是正确的方法。 提前感谢:)
问题内容: 我的模型与模型有关系。我已指定该关系应级联删除操作。但是,当我查询和删除用户时,出现一个错误,指出仍在引用地址行。如何删除用户和地址? 问题答案: 你有以下… 请注意,在“过滤器”之后,您仍然返回Query对象。因此,当您调用时,您正在调用Query对象(而不是User对象)。这意味着您正在执行批量删除(尽管可能只删除了一行) 您正在使用的方法的文档说… 该方法不提供Python中的级
我读过一些相关的问题,但它们和我的问题不完全一样。 我使用的是JPA Hibernate Spring,我想做一些我不确定是否仅通过配置就可以做到的事情。 我的域类具有或多或少复杂的关系。有许多元素与一个元素相关(就像是一棵树,许多元素是一个元素的子元素)。 类似的东西: 这样会得到一张桌子: 当我删除id=1的行时,我希望删除id=2和id=3的行(这可能是递归的,parent_id=2并且pa
我使用的是Hibernate的JPA实现。我有一个包含不同类型用户(私有、公共等)的用户表,user_type列指定用户的类型。 我有一个User类,它是一个表示User表的实体。我补充说 在我的用户类上创建了两个类,PrivateUser和PublicUser,它们都用相应的@DiscriminatorValue扩展了用户类。 如果我的解释不清楚,请让我知道。 提前致谢