0 0

配置hibernate annotation @OneToMany时级联更新不删除问题20

代码如下实体类

@Entity
public class A {
    @OneToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE,CascadeType.REFRESH}, fetch = FetchType.LAZY,mappedBy="a")
    public Set<B> bs = new HashSet<B>(0);
}

@Entity
public class B {
    @ManyToOne{fetch = FetchType.LAZY}
    @JoinColumn("id",nullable=false)
    public A a;
}

    如果A中SET集合中放入几个新建B的对象, 配置JUNIT测试做UPDATE动作,不会删除数据库中已有数据,而只是新插入数据。
根据官方文档配置说明,修改配置 A中的@OneToMany里删除mappedBy="a",B中@JoinColumn里加入insertable=false,updatable=false,重新做测试,就报错,如果删除mappedBy="a",hibernate就会去找一个名为“A_B”的中间表,如果加入insertable=false,updatable=false就无法做插入动作。
    郁闷中,试好几种方法都不行,哪位高手能给个解决办法,要实现级联更新时自动更新到已存在的数据,
感觉上用配置XML能实现的用annotation应该也可以实现的,不用在代码再写将查询结果修改后重新放入到SET集合里,
或是再手动执行删除动作吧,那样太笨了。
问题补充:
我要的就是能够级联删除的,不能用CascadeType.ALL的,用了不做删除动作的,
我在做测试时,只有@OneToMany里删除mappedBy="a",B中@JoinColumn里加入insertable=false,updatable=false时,看到控制台有打印出delete语句,其它情况
都不会打出delete。但这种情况下会去找A_B表而不是B表里,所有会delete from A_B。同时insert和update动作也不能作了。我的情况就是这样,希望再做更新时删除以有数据重新插入新数据。
举个例子:A表是人员表,记录每个人的信息,B表是人员——城市表,记录每个人所在城市信息,比如一个人第一次在广州买的房子,那B表里有人员ID,广州ID,一年以后,他把广州房子卖了,在上海,北京各买了房子,那么现在B表就只能有这个人所在的上海ID跟北京ID。
反过来,如果第一次在上海跟北京各买了房子,一年以后把上海跟北京的卖了,在广州买了房子,这种情况呢,所以UPDATE是不能满足要求的。
问题补充:
CascadeType.DELETE_ORPHAN 这个是hibernate包里的,只能起到辅助功能的作用,辅助功能的增强。
2008年6月18日 11:17

4个答案 按时间排序 按投票排序

0 0

不明白楼主在说什么 - -.
你要删除B表中数据不是直接在B中删除么?

你要从A中删除B中数据
不是应该直接删除了A中人员ID、然后他才会级联删除B中城市ID

而你只是纯粹想删除B中城市ID而不想删除A中人员ID 。
那只能直接从B中删除撒 。

另一种做法就是、你不是要update ?
update之前把要update的A ID数据先从A中删除、
自然他就会级联删除B中所有城市ID 。
然后你再把新的update动作提交 就可以了 。

好吧 如果你有更好做法 可以告诉我 。
本人没用过Hibernate 。
因为一个月前刚接触的EJB,老师用的是EJB3.0(据说已经整合了Hibernate?)
Over~

2008年6月22日 08:34
0 0

难道用CascadeType.DELETE_ORPHAN不能级联删除?

2008年6月19日 23:33
0 0

改成CascadeType=ALL应该可以解决问题,但是你可能不希望实现级联删除,这样的话你把
javax.persistence.CascadeType
改成Hibernateg下的
CascadeType
再按照你这种写法应该就可以了,原因不明,我也很想知道,我现在的项目就是这么做的

2008年6月18日 18:05
0 0

应该是这里的问题吧,@OneToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE,CascadeType.REFRESH},

CascadeType是delete-orphan或者是all-delete-orphan的时候才会删除不在set中的对象。(呵呵,很少用annocation,说以只能用mapping里的名词)

2008年6月18日 14:37

相关推荐

    Hibernate- oneToMany using annotation

    `mappedBy`属性指定了关联字段在`Post`实体中,`cascade`属性设为`ALL`意味着在保存、更新或删除`User`时,也会相应地操作`Post`,`orphanRemoval`设为`true`则表示删除用户时,其相关的帖子也会被删除。 在实际...

    最全的Hibernate Annotation API文档

    在Hibernate中,注解(Annotation)是一种声明式的方法,用于配置实体类、属性以及它们与数据库表之间的映射关系。本文将深入探讨“最全的Hibernate Annotation API文档”中的关键知识点。 一、实体类(Entity) 在...

    hibernate annotation 中文文档

    - `@Cascade`: 可以定义实体间的级联操作,如SAVE_UPDATE、DELETE等,使得操作父实体时,子实体也能相应更新或删除。 5. **懒加载与瞬时性** - `@LazyCollection`: 实现集合属性的懒加载,延迟加载直到真正需要时...

    Hibernate Annotation入门

    而Hibernate Annotation是Hibernate的一个重要特性,它通过在Java类和字段上添加注解来简化数据库表和实体类之间的映射配置。这篇博文将带你了解如何使用Hibernate Annotation进行开发。 首先,我们需要理解Java...

    hibernate-annotation-3.4.0.GA

    2. `cascade`属性:在关联注解中,如`@OneToMany`或`@ManyToOne`,可以设置`cascade`属性来控制级联操作,如级联保存、删除等。 八、其他注解 1. @Temporal:用于日期和时间类型的字段,指定存储类型(TIMESTAMP, ...

    hibernate-Annotation.jar

    - `@Cascade`:级联操作,比如删除父对象时,可以选择是否同时删除子对象。 6. **其他注解** - `@Table`:用于指定实体类对应的数据库表名。 - `@Inheritance`:继承关系映射,可以设置单表继承或多表继承策略。...

    Hibernate Annotation 基于外键的一对多双向关联

    同样,当保存或更新`Order`时,它也会同步更新`User`对象的关联信息。 理解源码层面的工作原理,我们可以查看Hibernate的`org.hibernate.event.spi.EventSource`和`org.hibernate.event.internal.ReplicateEvent`等...

    hibernate annotation 3.40

    在某些复杂场景下,例如级联操作或复杂的查询,XML配置仍然有其不可替代的作用。 - 注解的滥用可能导致代码过于拥挤,影响可读性。合理地使用注解是提高代码质量的关键。 6. **总结** Hibernate Annotation 3.4.0...

    Hibernate Annotation 学习笔记

    Annotation 在 Hibernate 中扮演着关键角色,它们为数据库对象提供了元数据,使得无需XML配置就能实现数据持久化。本笔记将深入探讨Hibernate Annotation的相关知识点。 1. **实体类与@Entity** - `@Entity` 注解...

    Hibernate Annotation应用

    而Hibernate Annotation是Hibernate框架的一部分,它允许开发者使用注解来配置实体类,替代传统的XML配置文件。本文将深入探讨Hibernate Annotation的应用,帮助开发者更好地理解和使用这一功能。 首先,让我们理解...

    Hibernate annotation JPA 一对多,多对多

    使用`cascade`属性可以配置级联操作,比如`CascadeType.ALL`会将父实体的操作(如保存、更新、删除)级联到子实体。这简化了数据操作,但也可能引发数据安全问题,因此需谨慎使用。 7. **乐观锁与悲观锁**: 为了...

    hibernate_annotation

    4.2 CascadeType注解:定义级联操作,如保存、更新、删除等: ```java @OneToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}) private List&lt;Order&gt; orders; ``` 五、其他高级特性 5.1 InheritanceType...

    Hibernate-Annotation-3.4.0帮助文档

    - `@Cascade`: 控制关联对象的级联操作,如删除或保存时是否一同操作关联对象。 - `@LazyCollection`: 实现集合的懒加载,提高程序性能。 - `@PrePersist`, `@PostPersist`, `@PreUpdate`, `@PostUpdate`, `@...

    Hibernate annotation 详解

    自Hibernate 3开始,引入了注解(Annotation)支持,使得开发者无需XML配置就能实现对象与数据库表之间的映射。本文将深入探讨Hibernate注解的使用方法和常见注解,旨在帮助开发者更好地理解和应用Hibernate注解。 ...

    Hibernate_Annotation参考文档

    - `@Cascade`注解可以配置级联保存、更新、删除等行为。 #### 三、XML配置与映射文件 - **实体映射文件**:使用`.hbm.xml`文件进行实体类的映射配置。 - ****元素用于定义实体类。 - ****元素用于定义主键字段...

    Hibernate-Annotation初步.rar

    【描述】中提到的“Hibernate-Annotation”是指Hibernate框架中的一种元数据声明方式,它允许开发者通过在Java类和字段上直接使用注解(Annotation)来替代传统的XML配置文件(如*.hbm.xml)。这种做法显著提高了...

    Hibernate one-to-many-annotation

    3. **cascade**:这个属性用于控制级联操作,比如`CascadeType.ALL`会将操作(如保存、更新、删除)应用到关联的对象上。 4. **orphanRemoval**:如果设置为`true`,当从一方(User)的集合中移除元素时,对应的...

    hibernate annotation

    **标题:“Hibernate 注解”** **一、Hibernate 注解简介** Hibernate 是一款广泛使用的 Java 应用程序开发框架,主要用于对象关系映射(ORM),它允许开发者使用面向对象的编程方式来操作数据库。在 Hibernate 3 ...

    hibernate_annotation_api

    **hibernate_annotation_api** 在Java开发中,Hibernate是一个非常重要的对象关系映射(ORM)框架,它极大地简化了数据库操作。而Hibernate的注解API是其核心特性之一,允许开发者通过在Java类和属性上添加注解来...

Global site tag (gtag.js) - Google Analytics