gpt4 book ai didi

java - Hibernate:添加一个对象(如果尚不存在)

转载 作者:行者123 更新时间:2023-12-01 15:43:01 25 4
gpt4 key购买 nike

情况如下:我正在创建一个每天运行的批处理脚本,解析日志文件并将数据导出到数据库。这个文件的格式基本上是

std_prop1;std_prop2;std_prop3;[opt_prop1;[opt_prop2;[opt_prop3;[..]]]

标准属性映射到一个表,每个属性有一列,其中日志文件中的每一行基本上映射到相应的行。它可能看起来像LOGDATA(id,timestamp,systemId,methodName,callLenght)。由于我们应该能够记录尽可能多的可选属性,因此我们不能将它们映射到同一个表,因为这意味着每次引入新属性时都会在表中添加一行。不要考虑 NULL 引用的数量...

因此,附加属性位于另一个表中,例如 EXTRA_PROPS(logdata_foreign_key,propname,value)。实际上,大多数可选属性都是相同的(例如操作系统版本、应用程序容器等),这使得在 EXTRA_PROPS 中为 LOGDATA 中的每一行记录 4 行(在平均有 4 个额外属性的情况下)有点浪费。特性)。所以我希望我的批处理工作做的是

for each additionalProperty in logRow:
see if additionalProperty already exist
if exists:
create a reference to it in a reference table
if not:
add the property to the extra properties table
create a reference to it in a reference table

然后我可能会得到三个略有不同的表:

LOGDATA(id,timestamp,systemId,methodName,callLenght)
EXTRA_PROPS(id,propname,value)
LOGDATA_HAS_EXTRA_PROPS(logid,extra_prop_id)

我不是 100% 这是一个更好的方法,我仍然会在 LOGDATA_HAS_EXTRA_PROPS 表中为 N 个属性创建 N 行,但至少我不会向 LOGDATA_HAS_EXTRA_PROPS 表中添加任何新行EXTRA_PROPS

即使这可能不是最好的方法(什么是?),我仍然想知道技术方​​面:我将如何使用 Hibernate 来实现这个?它不必非常快,但需要处理 100K+ 行。

最佳答案

首先,我不建议使用 Hibernate 来处理此类逻辑。 Hibernate 是一个很棒的产品,但执行这种高负载数据操作可能不是它的最强点。

从数据建模的角度来看,在我看来 (propname,value)实际上是 EXTRA_PROPS 中的主键。基本上,您想要表达的逻辑是,例如 hostname + foo.bar.com组合只会在表中出现一次。我对吗?那就是PK。所以你需要在 LOGDATA_HAS_EXTRA_PROPS 中使用它。使用name单独引用还不够。

在 Hibernate 中(如果您选择使用它),可以使用 @EmbeddedId 通过组合键来表达。或Embeddable在映射到 EXTRA_PROPS 的对象上。然后你可以拥有使用 LOGDATA_HAS_EXTRA_PROPS 的多对多关系作为关联表。

关于java - Hibernate:添加一个对象(如果尚不存在),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7702008/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com