-
JPA 一对多级联更新时,不能级联删除.30
级联新增,删除都ok;
级联更新时,修改从表内容的update,新增也ok,就是删除不ok.
以下贴出代码部分,望大家能够指点.
public class Account implements java.io.Serializable
{
private String id;
private String name;
private String enabled;
private Set<Acct2group> acct2groups = new HashSet<Acct2group>(0);
@OneToMany(cascade = CascadeType.ALL, mappedBy = "account")
public Set<Acct2group> getAcct2groups()
{
return this.acct2groups;
}
将Account类查出后,
Account account = dao.findById(1);
Set set = account.getAcct2groups();//此时set结果集为4
set.clear();
em.merge(account);
事务是spring控管的,做别的持久层动作都没问题.
就是不能将remove掉的4个Acct2group对象,重DB中删除.
将set.clear换成set.iterator().hasNext()迭代remove也不可以.
大家伙帮忙看看啊.
问题补充:
kamhung 你好,
我用的是hibernate,org.hibernate.annotations.CascadeType没有DELETE_OPTION这个属性啊.只有DELETE和DELETE_ORPHAN.我两个都试了一下,都没有达到删除孤子的效果啊,还望再次帮助.2008年7月22日 16:42
4个答案 按时间排序 按投票排序
-
采纳的答案
JPA规范是不支持级联删除, 不过一般实现方都会提供扩展功能来支持。
如果你用的是toplink实现包的话, 你就要实现一个DescriptorCustomizer 接口
public class AccountDescriptorCustomizer implements DescriptorCustomizer {
public void customize(ClassDescriptor descriptor) throws Exception {
OneToManyMapping mapping = (OneToManyMapping) descriptor.getMappingForAttributeName("acct2groups");
if (mapping != null) mapping.setIsPrivateOwned(true);
}
}
然后在persistence.xml 中properties节点下加入:
<property name="toplink.descriptor.customizer.包名.Account" value="包名.AccountDescriptorCustomizer"/>
最后Acct2group 中 @ManyToOne 属性cascade将CascadeType.ALL 改成 {CascadeType.REFRESH, CascadeType.MERGE, CascadeType.MERGE}.
如果是hibernate的实现的话, 在@OneToMany
旁边加上: @org.hibernate.annotations.Cascade(org.hibernate.annotations.CascadeType.DELETE_OPTION)2008年7月23日 13:23
相关推荐
总结,本资料包主要探讨了JPA中一对多双向关联的配置以及级联操作的使用,这些都是在实际开发中处理复杂对象关系时不可或缺的知识点。通过理解和熟练应用这些概念,开发者可以更加高效地管理数据库中的对象关系。
JPA用于整合现有的ORM技术,可以简化现有Java EE和Java SE应用对象持久化的开发工作,实现ORM的统一。JPA详解视频教程 第10讲 JPA中的一对多双向关联与级联操作.avi
3. **级联操作**:级联是指当对一个实体进行某些操作(如保存、删除)时,这些操作会自动传播到与其关联的其他实体。例如,如果我们设置级联类型为`CascadeType.ALL`,那么删除一个用户时,与之关联的所有订单也会被...
例如,`@OneToMany`和`@ManyToOne`用于表示一对多或多对一的关系,级联操作如`CascadeType.PERSIST`、`CascadeType.MERGE`等可以确保当一个实体被保存或更新时,与其关联的实体也会相应更新。这在处理关联数据时非常...
级联操作是JPA提供的一种特性,允许开发者指定当一个实体被持久化、更新、删除时,其关联的实体应该如何处理。这可以通过`CascadeType`枚举在`@OneToMany`注解中设置。例如,如果我们希望当用户被删除时,所有相关的...
- **级联操作**: 支持在实体之间定义级联操作,如删除一个实体时自动删除与之关联的其他实体。 - **延迟加载**: JPA的懒加载机制使得关联的对象只有在真正需要时才从数据库加载,提高性能。 **3. Hibernate JPA ...
本教程将深入讲解如何使用JPA进行对象的加载、更新和删除操作。 ### 1. JPA基本概念 #### 1.1 Entity(实体) 在JPA中,实体代表数据库中的表,通过在Java类上使用`@Entity`注解来标识。每个实体类对应一个数据库...
它可以负责实体的持久化、查询、更新和删除等操作。 4. **查询(Query)**: JPA提供了两种查询方式:JPQL(Java Persistence Query Language)和 Criteria API。JPQL是一种面向对象的查询语言,类似SQL,但操作的是...
### Hibernate JPA 知识点详解 #### 一、Hibernate JPA 概述 **Hibernate**作为当前最为流行的对象关系映射(Object Relational Mapping, ORM)框架之一,在Java开发领域占据着举足轻重的地位。它最早实现了**Java...
级联操作是JPA提供的另一个强大功能,它允许我们在操作一个实体时自动处理与其关联的其他实体。JPA提供了多种级联类型,如`CascadeType.PERSIST`、`CascadeType.MERGE`、`CascadeType.REMOVE`等。例如,如果设置为`...
赠送jar包:hibernate-jpa-2.1-api-1.0.2.Final.jar; 赠送原API文档:hibernate-jpa-2.1-api-1.0.2.Final-javadoc.jar; 赠送源代码:hibernate-jpa-2.1-api-1.0.2.Final-sources.jar; 赠送Maven依赖信息文件:...
`CASCADE`表示级联操作,即删除或更新主表记录时,相应的子表记录也会被删除或更新。`RESTRICT`或`NO ACTION`则阻止在子表有相关记录时删除或更新主表记录,而`SET NULL`会在主表记录被删除或更新时,将子表对应字段...
赠送jar包:hibernate-jpa-2.1-api-1.0.2.Final.jar; 赠送原API文档:hibernate-jpa-2.1-api-1.0.2.Final-javadoc.jar; 赠送源代码:hibernate-jpa-2.1-api-1.0.2.Final-sources.jar; 赠送Maven依赖信息文件:...
实体Bean之间的级联关系是Java持久化框架如Hibernate或JPA中的一个重要概念,它涉及到...此外,如果不正确地设置级联,可能会意外删除或更新不应该受影响的关联数据,所以需要在设计时充分考虑数据的完整性和业务逻辑。
《Apress.Pro.JPA.2.2nd.Edition.Oct.2013》是一部关于Java持久化API(Java Persistence API,简称JPA)的专著,由Apress出版社于2013年10月出版。这本书是JPA 2.2版本的详细指南,旨在帮助开发者深入理解和有效利用...
赠送jar包:spring-data-jpa-2.0.9.RELEASE.jar; 赠送原API文档:spring-data-jpa-2.0.9.RELEASE-javadoc.jar; 赠送源代码:spring-data-jpa-2.0.9.RELEASE-sources.jar; 赠送Maven依赖信息文件:spring-data-jpa...
hibernate-jpa-2.0-api-1.0.1.Final.jar
本课程"07_传智播客JPA详解_使用JPA加载_更新_删除对象"将深入讲解JPA在加载、更新和删除对象方面的应用。 首先,让我们了解一下JPA的基本概念。JPA通过实体类(Entity Class)来映射数据库表,实体类中的属性对应...
5. **生命周期回调(Lifecycle Callbacks)**: 支持在实体的生命周期事件(如创建、更新、删除)中执行自定义逻辑。 6. **缓存(Caching)**: 提供一级缓存(实体管理器内部)和二级缓存(可选,跨会话)以提高性能...