我在整个应用程序中使用了一个Session,但是我收到了错误:
线程“Thread-9”中的异常org.hibernate.AssertionFailure: 可能的非线程安全访问会话
这种情况偶然发生,并非总是如此。
在JTable模型中我有这个:
public Object getValueAt(int rowIndex, int columnIndex) {
Invoice i = invoices.get(rowIndex);
Object[] values = new Object[] { i.getInvoiceId(), i.getIdent(),
i.getTotalExclVat(), i.getTotalInclVat(), i.getIssueDate(),
i.getTaxDate(), i.getDueDate(), i.getPayType(),
i.getWeight(), i.getSupplier().getName(),
i.getInvoiceItems().size() };
return values[columnIndex];
...
Invoice是Hibernate @Entity和@Table,它连接了InvoiceItems。
问题是:如何处理Swing JTable中的Hibernate Session以避免'可能的非线程安全访问会话'错误?
感谢。
答案 0 :(得分:2)
TableModel#getValueAt()
已经(或应该)在event dispatch thread (EDT)上运行。正如所讨论的here,“每个线程/事务应该从SessionFactory
获取自己的实例。”工厂主题可以通过TableModel
更新EDT上的invokeLater()
。