【问题标题】:How to delete multiple items from an Observable List with Hibernate如何使用 Hibernate 从 Observable 列表中删除多个项目
【发布时间】:2020-01-20 23:16:40
【问题描述】:

我在 Javafx 表中有许多项目。我希望能够进行多行删除

我已经添加了下面的代码,但是我需要关于 Hibernate 的建议

shiftonTable.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);

@FXML
private void handleDeleteShiftOn() {
    int selectItem = shiftonTable.getSelectionModel().getSelectedIndex();
    if (selectItem >= 0) {

         ObservableList<ShiftOnDate> itemsSelected, AllSelected;
         AllSelected = shiftonTable.getItems();  
            itemsSelected = shiftonTable.getSelectionModel().getSelectedItems();

        Alert alert = new Alert(AlertType.CONFIRMATION);
        alert.setTitle("Confirmation Dialog");
        alert.setHeaderText("Look, a Confirmation Dialog");
        alert.setContentText("Are you sure you want to Delete?");

        Optional<ButtonType> result = alert.showAndWait();
        if (result.get() == ButtonType.OK) {
            rosterService.removeShiftOnDate(itemsSelected);
            loadShiftOn();
        } else


@Override
public void removeShiftOnDate(ObservableList<ShiftOnDate> itemsSelected) {

    Session session = sessionFactory.getCurrentSession();
    session.beginTransaction();
    //ShiftOnDate s = (ShiftOnDate) session.load(ShiftOnDate.class, itemsSelected);
    session.delete(itemsSelected);
    session.getTransaction().commit();

    session.close();
}

我可以看到 itemsSelected 但不确定如何正确传递给休眠以删除项目。

【问题讨论】:

  • 这是tutorial on deleting items with hibernate。也许你可以从中找出你需要做的事情。这使用实体管理器工厂,但您直接使用休眠会话,因此可能不适用(但也许最好使用use an entity manager factory。可能您需要做的就是遍历可观察列表中的项目,调用session.delete每个项目。
  • 我刚刚遍历了 observablelist 中的项目。它工作正常。我想我正在寻找一种不同的方法。 (也许我认为在 Hibernate 中有一些很酷的方法)看不到森林的树木。我将继续采用这种方法。感谢您指出显而易见的。非常感谢。

标签: hibernate


【解决方案1】:

您应该尝试org.hibernate.ScrollableResults 类来删除多个项目。以下是如何删除的示例:

public static void purgeyourRecords() {
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = null;
        try {
            tx = session.beginTransaction();
            Criteria cr = session.createCriteria(EntityClass.class);
            cr.add(Restrictions.eq("fieldName", fieldValue));
            ScrollableResults items = cr.scroll();
            int count = 0;
            while (items.next()) {
                EntityClass entity= (EntityClass) items.get(0);
                session.delete(entity);
                if (++count % 100 == 0) {
                    session.flush();
                    session.clear();
                }
            }
            tx.commit();
        } catch (HibernateException asd) {
            log.debug(asd.getMessage());
            if (tx != null) {
                tx.rollback();
            }
        } finally {
            session.close();
        }

    }

这将删除标准中的所有记录。您可以先将您的列表创建为cr.list,然后将其作为变量传递。

【讨论】:

    【解决方案2】:

    遍历列表并对每个项目调用 delete:

    @Override
    public void removeShiftOnDate(ObservableList<ShiftOnDate> itemsSelected) {    
        Session session = sessionFactory.getCurrentSession();
        session.beginTransaction();
        for (ShiftOnDate item: itemsSelected) {
            session.delete(item);
        }
        session.getTransaction().commit();    
        session.close();
    }
    

    【讨论】:

      猜你喜欢
      • 2015-04-13
      • 1970-01-01
      • 1970-01-01
      • 2020-11-16
      • 1970-01-01
      • 2021-07-19
      • 2011-10-27
      • 1970-01-01
      • 2016-03-12
      相关资源
      最近更新 更多