【问题标题】:Can I get a TableView column to use a Kotlin Exposed transaction when referencing a property?引用属性时,我可以获得 TableView 列以使用 Kotlin Exposed 事务吗?
【发布时间】:2019-08-15 22:32:18
【问题描述】:

使用 TornadoFX 时,TableView 的列是这样建立的:

tableview(list<ObjectType>) {
   column("ColumnName", ObjectType::property)
   ...
}

这通常很好,但在我的情况下,我使用的是 Kotlin Exposed 实体,该实体使用对另一个实体的引用。发生这种情况时,如果您想使用该引用,则必须将其包围在事务中。

例子:

val company = transaction { employeeObject.companyObject }

如果您不在事务中包装这样的调用,则会引发错误。似乎没有明显的方法来覆盖列访问属性的方式,所以我想知道它是否存在。

现在,我已经尝试将我的实体包装在另一个类中,该类将预先执行所有必要的事务,但是当需要映射的实体数量达到数千时,它会导致我的程序基本上进入一动不动。如果需要,我可以回到以前的状态,即没有参考,而只是另一个实体的普通旧 ID 号。然后,该列的单元格格式将尝试将公司与之前抓取的列表中的所有公司进行匹配。虽然我不太喜欢这种解决方案,它看起来更丑陋且不那么优雅,但它比映射实体快得多。我想要实现的目标也有可能导致其自身的放缓。我只是想知道这是否可能,这样我至少可以看看它有多快。

【问题讨论】:

  • 通过“预先完成所有必要的交易”,我认为您的意思是调用一个返回列表的函数。您是否考虑过流式传输从数据库返回的数据,可能使用协程通道?
  • 您绝对应该提前获取数据。即使您确保在事后检索数据时启动事务,这也会发生在 ui 线程上,这将违反合同 - 您不应该在 ui 线程上做任何繁重的工作。无需在这里寻找解决方案,只需预先加载您想要的数据。

标签: kotlin tornadofx kotlin-exposed


【解决方案1】:

感谢 Edvin,提醒我列在 UI 线程上工作,它不应该做繁重的工作!我尝试了一些其他的映射方法,希望瓶颈是我正在做的交易量,但这对速度没有帮助。所以我认为让我的视图预先检索所有公司的列表,然后让我的列在该列表中找到公司是要走的路。不那么漂亮,但没有慢下来!

但要正式回答我自己的问题:没关系,不要在UI线程中尝试。这是不好的做法,会影响性能。

【讨论】:

    猜你喜欢
    • 2011-04-10
    • 2018-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-21
    • 2017-10-03
    • 2022-07-27
    • 2018-11-04
    相关资源
    最近更新 更多