如何使用 Hibernate 从 Observable 列表中删除多个项目
Posted
技术标签:
【中文标题】如何使用 Hibernate 从 Observable 列表中删除多个项目【英文标题】:How to delete multiple items from an Observable List with Hibernate 【发布时间】: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 中有一些很酷的方法)看不到森林的树木。我将继续采用这种方法。感谢您指出显而易见的。非常感谢。
【参考方案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();
【讨论】:
以上是关于如何使用 Hibernate 从 Observable 列表中删除多个项目的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Hibernate 从 Mysql 获取最后一条记录?
如何从 entitymanager 访问 Hibernate 统计信息?
如何使用 Hibernate 从 Sql 数据库中更新、删除对象?