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

Java 如何删除JPA/hibernate继承策略中的父元素和子元素?,java,hibernate,jpa,Java,Hibernate,Jpa,我有一张在JPA/Hibernate中映射的实体照片,它有三个不同的子对象(PhotoSpot、PhotoSector、PhotoVoie)。我使用了@heritance(strategy=InheritanceType.join),对于persist方法来说一切都很好,但是当我想要删除一张照片时,我无法使它工作 我试图通过从父类中删除一个元素来删除一张照片,但我不知道这是否可行。 我看了所有其他关于同一主题的帖子,我认为问题可能来自我的子实体有一个@manytone关联的事实。但我把这种联系放

我有一张在JPA/Hibernate中映射的实体照片,它有三个不同的子对象(PhotoSpot、PhotoSector、PhotoVoie)。我使用了@heritance(strategy=InheritanceType.join),对于persist方法来说一切都很好,但是当我想要删除一张照片时,我无法使它工作

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

以下是我的实体(我只是将父实体和一个子实体放在一起),它们都是相同的: 这是家长

@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;
        }
    }
这个问题是不是因为我用了错误的方法,我应该先删除子元素?通常,级联选项应允许我在删除父项时删除子项。谢谢

编辑:
正如我所预料的,问题来自关系。如果我启用org.hibernate.event.internal.DefaultPersistEventListener,我将像许多其他人一样获得
取消计划实体删除。我检查了这个和这个,但我不太明白它在我的传统案例中意味着什么。我试图手动删除关联,但它仍然不起作用

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

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

class AProduct {
    String name;
    @ManyToOne(cascade = CascadeType.REMOVE)
    Product product;
}
类产品{
字符串名;
@OneToMany(级联=级联类型。移除)
列出一个产品;
}
A类产品{
字符串名;
@多通(级联=级联类型。移除)
产品;
}

Thanks等待您的答案!可以肯定的是,你的意思是我应该用简单的关联来取代传统吗?是的,你也可以移动代码Photo Photo=entityManager.find(Photo.class,id);服务类中的代码,以及为什么您自己创建事务,只需使用实体管理器的方法就可以了。好的,谢谢,我明天会试试。交易?我没有使用spring,所以我想我必须手工操作不?我考虑过你的解决方案,但我不确定它是否适合我的项目(或者可能我没有正确理解)。我的桌上照片和孩子们之间没有任何关系。这显然是我的遗产计划。所有的PhotoSpot、Photospecter和PhotoVoie都是。。。照片。或者我应该把我的关系颠倒过来,让光切割器,PhotoVoie,PhotoSpot在一边一,实体照片在一边多。但正常情况下,在继承的情况下,我应该能够正确地删除所有内容,而不会改变我的结构。