当前位置: 首页 > 知识库问答 >
问题:

如何删除JPA/Hibernate继承策略中的父子元素?

尚安平
2023-03-14

我有一个实体照片映射在JPA/Hibernate,有三个不同的孩子(PhotoSpot,PhotoSecteur,PhotoVoie)。我使用了@继承(策略=继承类型。JOINED),一切工作正常的持久化方法,但我不能设法使其工作时,我想删除的照片之一。

我试图通过从父类中删除一个元素来删除一张照片,但我不知道这是否可行。我看了所有其他关于同一主题的帖子,我认为问题可能来自我的子实体有一个@manytone关联的事实。但我把这种联系放在了cascade=cascade类型中。都在一边。

这里是我的实体(我只是把父和一个孩子),他们都是一样的:这里是父

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class Photo implements Serializable{
    // todo fichier properties
    private static final String CHEMIN = "D:\\fichiers\\";
    private static final int TAILLE_TAMPON = 10240;
    public static final String CHAMP_PHOTO = "photo";

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    protected Long id;
    protected String nom;

这是一个孩子

@Entity
@Table
@PrimaryKeyJoinColumn(name = "id")
@OnDelete(action = OnDeleteAction.CASCADE)
public class PhotoSpot extends Photo {

    @ManyToOne
    private Spot spot;

我的删除方法:

    public boolean deletePhoto(Long id){
        EntityTransaction transaction = entityManager.getTransaction();
        try {
            transaction.begin();
            Photo photo = entityManager.find(Photo.class, id);
            entityManager.remove(photo);
            entityManager.flush();
            Path path = Paths.get(Photo.getCHEMIN()+photo.getNom());
            Files.delete(path);
            transaction.commit();
            return true;
        }catch (Exception e){
            if (transaction != null)
                transaction.rollback();
            e.printStackTrace();
            return false;
        }
    }

这个问题是不是因为我用了错误的方法,我应该先删除子元素?通常,级联选项应允许我在删除父项时删除子项。谢谢

编辑:如我所料,问题来自于关系。如果我启用组织。冬眠事件内部的DefaultPersistEventListener我和许多其他人一样获得了取消实体删除计划的。我检查了这个JPA/Hibernate删除实体有时不工作这个Hibernate实体管理器:删除引用的实体不工作,这防止Hibernate在合并实体关联时删除孤立实体,而孤立删除设置为true,但我不完全理解它在我的传统案例中意味着什么。我试图手动删除关联,但它仍然不起作用。


共有1个答案

蒋嘉颖
2023-03-14

每当父删除时,所有的子都会自动删除

class Product {
    String name;
    @OneToMany(cascade = CascadeType.REMOVE)
    List<AProduct> aProduct;
}

class AProduct {
    String name;
    @ManyToOne(cascade = CascadeType.REMOVE)
    Product product;
}
 类似资料:
  • 主要内容:连接策略示例在连接策略中,为每个实体类生成一个单独的表。 每个表的属性都与主键连接。 它消除了字段字重复的可能性。 以下语法表示连接的策略: - 连接策略示例 在这个例子中,我们将员工分为活跃员工和退休员工。 因此,子类和继承父类的和字段。 现在,按照以下步骤创建JPA项目 - 第1步: 在包下创建一个根实体类并指定所有必需的属性和注释。 文件:Employee.java - 第2步: 在包下创建实体类(它是

  • 主要内容:单表策略示例单表策略是定义继承实现的最简单有效的方法之一。 在这种方法中,多个实体类的实例仅作为属性存储在单个表中。 以下语法表示单个表策略 - 单表策略示例 在这个例子中,我们将员工分为活跃员工和退休员工。 因此,子类和继承父类的和字段。 现在,按照以下步骤创建JPA项目 - 第1步: 在包下创建一个根实体类并指定所有必需的属性和注释。 文件:Employee.java - 第2步: 在包下创建实体类(它是

  • 由于某些原因,我无法使Hibernate继承策略=InheritanceType.Joint&onetoMany的组合工作。以下是这些实体。 @实体

  • 主要内容:连接策略示例在按类表策略中,为每个子实体类生成一个单独的表。 与连接策略不同,在按类表策略中不会为父实体类生成单独的表。 以下语法表示按类表策略 - 连接策略示例 在这个例子中,我们将员工分为活跃员工和退休员工。 因此,子类和继承父类的和字段。 现在,按照以下步骤创建JPA项目 - 第1步: 在包下创建一个根实体类并指定所有必需的属性和注释。 文件:Employee.java - 第2步: 在包下创建实体类(

  • 我有一个定义如下的表: 然后我有了这个继承的表: Hibernate在数据库中创建了两个表,但是当我试图在JPA上删除一个继承的对象时,它会返回外键约束违反错误,因为它试图删除第一个类。如何在删除超类时首先删除继承类,以避免键约束违反错误? 谢谢你。

  • 当我只有product类和两个用继承策略扩展product的类时,单表(product- 必须在根实体中定义鉴别器列,它将在子类com中被忽略。实例演示。实体电子学 产品类别 电子类: 智能手机类别: 我想把电子学课分成两个不同领域的实体。