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

Hibernate无法删除子记录

宋岳
2023-03-14
<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>

EventLicensetype.hbm.xml文件:

<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>

下面是EventInfo类。同样,在实际文件中有更多的字段,这只是重要的部分:

public class Eventinfo implements Serializable {
     /** identifier field */
    private int eventInfoId;    

    /** nullable persistent field */
    @Field(name="eventInfo_eventTypeId")
    private String eventTypeId;

    @IndexedEmbedded
    private Set<EventLicenseType> eventLicenceTypeIds;

    /** default constructor */
    public Eventinfo() {}

    public int getEventInfoId() {
        return this.eventInfoId;
    }

    public void setEventInfoId(int eventInfoId) {
        this.eventInfoId = eventInfoId;
    }

    public String getEventTypeId() {
        return this.eventTypeId;
    }

    public void setEventTypeId(String eventTypeId) {
        this.eventTypeId = eventTypeId;
    }

    public Set<EventLicenseType> getEventLicenceTypeIds() {
        return eventLicenceTypeIds;
    }

    public void setEventLicenceTypeIds(Set<EventLicenseType> eventLicenceTypeIds) {
        this.eventLicenceTypeIds = eventLicenceTypeIds;
    }

下面是EventLicenseType类

public class EventLicenseType implements Serializable{

    @Field
    private int licenseTypeId;
    private int eventInfoId;

    public int getLicenseTypeId() {
        return licenseTypeId;
    }

    public void setLicenseTypeId(int licenseTypeId) {
        this.licenseTypeId = licenseTypeId;
    }

    public int getEventInfoId() {
        return eventInfoId;
    }

    public void setEventInfoId(int eventInfoId) {
        this.eventInfoId = eventInfoId;
    }
}
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);
}

谁能帮我解决我缺少的东西,或者给我指明正确的方向?

共有1个答案

甄佐
2023-03-14

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

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

希望这能解决你的问题。

 类似资料:
  • 有这两个类: ddress.java: User.java: 演示应用程序。爪哇: 运行时,如果失败,出现此错误: GenerationTarget遇到异常接受命令:通过JDBC语句执行DDL“更改表user_addresses删除外键FKfm6x520mag23hvgr1oshaut8b”时出错 然而,最终的表格被创建:: : 为什么jdbc不能删除表中的外键?如何让jdbc做到这一点?

  • 我正在尝试删除一个父/子自连接实体,但无法这样做,这里是我的映射

  • 我正在运行此查询, 这是您在图片中看到的id为19的唯一删除记录。 id的列类型是整数。

  • 我试着在这里找到类似的问题,我在这里找到了这个,但它没有太大的帮助。 这正是我的问题所在。问题是@ondelete迫使我建立双向关系,对吗?如果可能的话,我想保持单向性。 L.E:我修改了我的处理程序方法,看起来像这样

  • 问题内容: 我有两个分别以双向一对多关系存在的实体类 A 和 B。 A.java: B.java 在一个简单的控制台应用程序中,我从数据库中获取了特定的 A 行,并尝试删除其详细信息 B 行(随机),但是 JPA / Hibernate* 不仅删除了该行-甚至没有向该行发出任何 DELETE 语句。数据库。删除 B 行的唯一方法是从 A.java 的集合( LinkedHashSet )中删除相应

  • 如何更改Springboot Kafka的日志记录?我在我们的Splunk服务器上看到了超过200万条消息,但什么都不起作用: 还尝试了: 依赖性: 这些都没有任何作用。我错过什么了吗?