Java 级联删除不';行不通

Java 级联删除不';行不通,java,hibernate,annotations,cascade,Java,Hibernate,Annotations,Cascade,我对Hibernate有问题。我的域名是凭证、优惠、外部用户、术语和术语用户注册。它们看起来像: @Entity(name = "Voucher") @Table(name = "extra_vouchers") public class Voucher implements Cloneable, Serializable{ 使用ID和其他属性。。。优惠券是一些优惠券。每个OfferDB(它是offer.。例如乘船旅行或其他旅行…)都有多张优惠券。每个外部用户也可以拥有多张凭证 此外,对优惠条

我对Hibernate有问题。我的域名是凭证、优惠、外部用户、术语和术语用户注册。它们看起来像:

@Entity(name = "Voucher")
@Table(name = "extra_vouchers")
public class Voucher implements Cloneable, Serializable{
使用ID和其他属性。。。优惠券是一些优惠券。每个OfferDB(它是offer.。例如乘船旅行或其他旅行…)都有多张优惠券。每个外部用户也可以拥有多张凭证

此外,对优惠条款(具体日期)也有一些保留意见——TermUserRegistration——每一次注册意味着一张凭证

然后提供:

@Entity
@Table(name = "extra_offers")
public class OfferDB implements Cloneable, Serializable {

@OneToMany (mappedBy="offer")
private List<Voucher> vouchers = new ArrayList<Voucher>();
现在我想问你们,是否有办法删除TermUserRegistration的ID,并删除它的连接关系,如凭证。。。我遇到一些级联删除异常问题

我的方法看起来像

@Override
public void unregisterUserFromTerm(Term termToExport, TermUserRegistration termUser) {
    Voucher voucherToDisable = voucherDao.findById(termUser.getExtraVoucher().getId());
    FreeVoucher freeVoucherToEdit = freeVoucherDao.findVoucherByCodeAndOfferId(termUser.getExtraVoucher().getCode(), termToExport.getOffer().getId());  

    Long l = Long.parseLong(String.valueOf(termToExport.getOffer().getId()));
    Offer offer = offerDao.findById(l);     

    ExtraUser extraUser = userDao.findById(termUser.getExtraUser().getId());

    termToExport.getUsers().remove(termUser);
    extraTermDao.update(termToExport);
    extraTermUserDao.delete(termUser);

    offer.getVouchers().remove(voucherToDisable);   
    offerDao.update(offer);

    extraUser.getVouchers().remove(voucherToDisable);
    userDao.update(extraUser);

    voucherDao.update(voucherToDisable);
    voucherDao.delete(voucherToDisable);

    freeVoucherToEdit.setFree(true);
    freeVoucherDao.update(freeVoucherToEdit);
}
但是我越来越

严重:路径为[/project]的上下文中Servlet[edit]的Servlet.service()引发了异常[执行失败:已删除的实例传递到update():[null实体名称#null]],其根本原因是
org.hibernate.ObjectDeletedException:已删除的实例传递给update():[null entity name#null]

很抱歉问了这么愚蠢的问题。我对(cascade=CascadeType.ALL)了解不多。出现问题。

您是否询问在删除TermUserRegistration时是否有方法删除已连接的凭证?凭单没有连接到任何其他对象,TermUserRegistration也没有连接到任何其他对象,因此我不确定如何连接到ExtraUser对象、Term对象或Offer对象。这些级联删除异常是什么?ExtraUser连接到TermUser(又称TermUserRegistration)@OneToOne(cascade=CascadeType.ALL)私有外部用户外部用户。。有关于电话号码、地址等的信息。这个问题中的术语可能是多余的。。。但优惠券也包含在优惠中,对吗?请尝试在映射中设置优惠券
@OneToOne(cascade=CascadeType.ALL,orphaneremovation=true)
@Entity(name = "Term")
@Table(name = "extra_term")
public class Term implements Cloneable, Serializable{

@OneToMany(cascade = CascadeType.ALL)
@JoinTable(name = "extra_term_user", joinColumns = { @JoinColumn(name = "term_id") }, inverseJoinColumns = { @JoinColumn(name = "term_user_id") })  
private List<TermUserRegistration> users = new ArrayList<TermUserRegistration>();   
@Entity(name = "TermUserRegistration")
@Table(name = "extra_term_users")
public class TermUserRegistration implements Cloneable, Serializable{

@OneToOne(cascade = CascadeType.ALL)
private Voucher extraVoucher;   
@Override
public void unregisterUserFromTerm(Term termToExport, TermUserRegistration termUser) {
    Voucher voucherToDisable = voucherDao.findById(termUser.getExtraVoucher().getId());
    FreeVoucher freeVoucherToEdit = freeVoucherDao.findVoucherByCodeAndOfferId(termUser.getExtraVoucher().getCode(), termToExport.getOffer().getId());  

    Long l = Long.parseLong(String.valueOf(termToExport.getOffer().getId()));
    Offer offer = offerDao.findById(l);     

    ExtraUser extraUser = userDao.findById(termUser.getExtraUser().getId());

    termToExport.getUsers().remove(termUser);
    extraTermDao.update(termToExport);
    extraTermUserDao.delete(termUser);

    offer.getVouchers().remove(voucherToDisable);   
    offerDao.update(offer);

    extraUser.getVouchers().remove(voucherToDisable);
    userDao.update(extraUser);

    voucherDao.update(voucherToDisable);
    voucherDao.delete(voucherToDisable);

    freeVoucherToEdit.setFree(true);
    freeVoucherDao.update(freeVoucherToEdit);
}