【问题标题】:How to delete from Hibernate using Composite Key如何使用复合键从 Hibernate 中删除
【发布时间】:2014-10-21 20:46:05
【问题描述】:

我真的希望能够从具有复合主键的单个表中删除记录。这是我的复合键代码(省略了获取器/设置器):

@Embeddable
public class MISExceptionStoreUploadControlPK implements Serializable {
    /**
     * Serializable class - generated UID
     */
    private static final long serialVersionUID = -2589068978210044521L;

    @Column(name="STORE_NO", nullable=false)
    private String storeNo;

    @Column(name="EXTRACT_TIME", nullable=false)
    private String extractTime;

这是我的实体代码(省略了获取器/设置器):

@Entity
@Table(name="SDSUSER_OWNER.MIS_EXCEPTION_STORE_UPLD_CNTRL")
public class MISExceptionStoreUploadControl implements Serializable {
    /**
     * Serializable class - generated UID
     */
    private static final long serialVersionUID = 545018012527944915L;

    //@Id
    @EmbeddedId
    private MISExceptionStoreUploadControlPK misExceptionStoreUploadControlPK;

    @Column(name="UNDER_EXTRACT_DAYS", nullable=true)
    private Integer underExtractDays;

    @Column(name="UNDER_WEIGHT_RESERVE", nullable=false)
    private Integer underWeightReserve;

这是尝试删除记录的代码:

// Retrieve session from Hibernate
        Session session = sessionFactory.getCurrentSession();

        MISExceptionStoreUploadControlPK recordToBeDeleted = (MISExceptionStoreUploadControlPK) session.load(MISExceptionStoreUploadControlPK.class, misExceptionStoreUploadControl.getMisExceptionStoreUploadControlPK());
        session.delete(recordToBeDeleted);

这是我得到的错误:嵌套异常是 org.hibernate.MappingException:未知实体:com.classifieds.beans.volumetrics.MISExceptionStoreUploadControlPK

编辑“删除”代码以使用 MISExceptionStoreUploadControl 对象也不起作用。我收到一条错误消息,提示需要 MISExceptionStoreUploadControlPK 对象。

如果有帮助 - 我可以确认从表中简单检索所有记录的工作正常。

我将不胜感激有关这方面的一些建议...谢谢!

【问题讨论】:

  • 我不建议使用@Embeddable 这意味着您可以在逻辑上创建为您创建的表hibernate 的两个对象。这意味着表格未标准化。我建议建立@OneToOne 关系。
  • 为什么要删除PK对象? PK 对象不是实体,不能显式删除。您只能使用与此 PK 对象关联的实体来删除它。
  • Dibya / Ivan,感谢您这么快回复我。请您再提供一点帮助好吗?我在哪里放置@OneToOne 以及如何从实体中删除记录?谢谢

标签: java hibernate


【解决方案1】:

我不会直接为您的答案提供解决方案,而是会告诉您如何删除。

首先,当您执行session.delete(object); 时,会触发一个查询(select) 以获取对象的持久性状态,而不是触发删除查询以删除记录。

您可以通过以下方式删除记录。

  1. session.delete(对象); - 这将删除记录,但您需要构造对象
  2. 使用查询 - 这将是我的选择,因为我可以使用“和”来满足我想要的多个条件

    Query query = session.createQuery("delete from TABLE where COL1 = :value");
    query.setParameter("value", 10);
    

【讨论】:

  • 您好 Dibya - 再次感谢您查看此问题。是的,使用 Query 肯定会起作用。我实际上让我自己的代码可以工作,并稍作更正。发布在下面...
【解决方案2】:

经过更多尝试,我得到了我必须工作的代码。对于其他所有人,这里是更正的代码:

// Retrieve session from Hibernate
        Session session = sessionFactory.getCurrentSession();

        MISExceptionStoreUploadControl recordToBeDeleted = (MISExceptionStoreUploadControl) session.load(MISExceptionStoreUploadControl.class, misExceptionStoreUploadControlPK);
        session.delete(recordToBeDeleted);

希望有用!

【讨论】:

    猜你喜欢
    • 2016-07-08
    • 2014-03-16
    • 2017-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多