Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate无法删除子记录_Java_Hibernate_Cascade - Fatal编程技术网

Java Hibernate无法删除子记录

Java Hibernate无法删除子记录,java,hibernate,cascade,Java,Hibernate,Cascade,更新(不删除)父记录时,无法删除子记录。另外,我也读过其他文章,但其他大多数文章似乎都在使用注释而不是xml,因此很难看出它们与我的问题之间的关系 我有两个表:一个是EventInfo表,它保存有关事件的信息,另一个是EventLicenseType表,它只有两列,这两列构成主键;EventLicenseType表中的一列是EventInfo表的外键 问题是我似乎无法删除EventLicenseType记录。我尝试了很多不同的方法,但都不管用。hibernate似乎想将null作为eventin

更新(不删除)父记录时,无法删除子记录。另外,我也读过其他文章,但其他大多数文章似乎都在使用注释而不是xml,因此很难看出它们与我的问题之间的关系

我有两个表:一个是EventInfo表,它保存有关事件的信息,另一个是EventLicenseType表,它只有两列,这两列构成主键;EventLicenseType表中的一列是EventInfo表的外键

问题是我似乎无法删除EventLicenseType记录。我尝试了很多不同的方法,但都不管用。hibernate似乎想将null作为eventinfoId列,这当然不起作用。我尝试过清除集合,然后进行合并,还专门调用session.delete(eventlicenseTypeRec),然后进行合并。两个都不适合我

EventInfo.hbm.xml文件:

<hibernate-mapping default-lazy="true">

<class name="Eventinfo" table="PA_EVENTINFO">
    <id name="eventInfoId" type="int"
        column="PA_EVENTINFOID">
        <generator class="native" />
    </id>
    <property name="eventTypeId" type="java.lang.String"
        column="PA_EVENTTYPEID" length="255" />

        ...Other columns not shown here for brevity...

    <set name="eventLicenceTypeIds" lazy="false" cascade="all-delete-orphan">
        <key column="PA_EVENTINFOID"/>
        <one-to-many class="EventLicenseType" />
    </set>      
</class>
<hibernate-mapping default-lazy="true">

<class name="EventLicenseType" table="PA_EVENTLICENSETYPE">
    <composite-id>
        <key-property name="licenseTypeId" type="java.lang.Integer" column="PA_LICENSETYPE"/>
        <key-property name="eventInfoId" type="java.lang.Integer" column="PA_EVENTINFOID"/>
    </composite-id>
</class>
这是我在DAO中执行的方法。目前只有一条记录与eventInfo记录关联,所以我只是想看看是否可以删除这条记录。(还要注意,eventinfo是在围绕此方法的方法中定义的)

在上面的session.flush()行中,我得到一个错误:java.sql.BatchUpdateException:无法将值NULL插入到表“PA_EVENTLICENSETYPE”的列“PA_EVENTINFOID”中;列不允许空值。更新失败。这表明hibernate正在尝试执行以下操作:

update PA_EVENTLICENSETYPE set PA_EVENTINFOID=null where PA_EVENTINFOID=?
为什么它不能删除记录呢?为什么它试图进行更新?? 我还尝试将代码更改为下面的代码,并得到相同的错误

public Eventinfo execute(Session session) throws Exception {

    //Clear out the list
    eventinfo.getEventLicenceTypeIds().clear();             

    return (Eventinfo) session.merge(eventinfo);
}

有谁能帮我解决我缺少的问题,或者给我指出正确的方向吗?

您需要查看两个表之间的映射是单边的还是双边的。基本上,您需要将两个表的行视为对象,并切断EventInfo和EventLicenceType表的对象之间的所有联系。因此,如果关系仅来自EventInfo->EventLicenseType,则需要在EventInfo对象中将EventLicenseType的值设置为null。此外,如果存在来自EventLicenseType的映射,则需要将联接列的值设置为null。然后合并()EventInfo对象

Noneed用于显式删除或移除EventLicenseType对象。如果这里没有对EventLicenseType对象的引用,JVM将把它作为垃圾收集


希望这能解决您的问题。

谢谢您的评论。我在帖子中添加了EventLicenseType类;我认为这种关系是单方面的。我刚刚尝试将EventLicenseTypeID置零,但得到一个错误“拥有实体实例不再引用cascade=all delete orphan的集合”。我在谷歌上搜索并了解,对集合调用clear()而不是将其置零是一种方法,但我已经尝试过了。您在引用子实体时是否在父实体中设置了@OneToMany(orphanRemoving=true)?否,因为我没有使用注释。在xml中有这样做的方法吗?它与cascade=“all delete orphan”不同吗?
public Eventinfo execute(Session session) throws Exception {

    //Get the existing eventInfo record                 
    Eventinfo existing = (Eventinfo)session.get(Eventinfo.class, eventinfo.getEventInfoId());
    Iterator iter = existing.getEventLicenceTypeIds().iterator();
    if (iter.hasNext()) {
        EventLicenseType license = (EventLicenseType) iter.next();
        iter.remove();
        session.delete(license);
    }

    session.flush();

    return (Eventinfo) session.merge(eventinfo);
}
update PA_EVENTLICENSETYPE set PA_EVENTINFOID=null where PA_EVENTINFOID=?
public Eventinfo execute(Session session) throws Exception {

    //Clear out the list
    eventinfo.getEventLicenceTypeIds().clear();             

    return (Eventinfo) session.merge(eventinfo);
}